gdb не перекликается с моим вводом до тех пор, пока я не нажму Enter [duplicate]

Хорошее объяснение того, что происходит при таком вычислении, содержится в документе n1188 из сайта ISO W14 .

Я объясняю идеи.

Основным правилом стандарта ISO 9899, ​​который применяется в этой ситуации, является 6.5p2.

Между предыдущей и следующей точкой последовательности объект должен иметь свое сохраненное значение не более чем один раз, оценивая выражение. Кроме того, предыдущее значение должно быть считано только для определения значения, которое нужно сохранить.

blockquote>

Точки последовательности в выражении типа i=i++ находятся перед i= и после i++.

В документе, который я привел выше, объясняется, что вы можете определить, что программа сформирована маленькими ящиками, каждая из которых содержит инструкции между двумя последовательными точками последовательности. Точки последовательности определены в приложении C стандарта, в случае i=i++ есть две точки последовательности, которые ограничивают полное выражение. Такое выражение синтаксически эквивалентно записи expression-statement в форме грамматики Бэксу-Наура (грамматика приведена в приложении A стандарта).

Таким образом, порядок инструкций внутри ящика не имеет четкого порядка.

i=i++

можно интерпретировать как

tmp = i
i=i+1
i = tmp

или как

tmp = i
i = tmp
i=i+1

, поскольку обе эти формы интерпретируют код i=i++ являются действительными и потому, что оба генерируют разные ответы, поведение не определено.

Таким образом, точка последовательности может быть видна в начале и в конце каждого окна, которое составляет программу [поля представляют собой атомные единицы в C] и внутри ящика порядок команд не определен во всех случаях. Изменение этого порядка иногда может изменить результат.

EDIT:

Другим хорошим источником для объяснения таких неоднозначностей являются записи с сайта c-faq (также опубликованный как книга ), а именно здесь и здесь и здесь .

14
задан Nakilon 10 October 2013 в 17:50
поделиться

4 ответа

$ ssh -t foo.bar.com gdb
...
(gdb) ^C
Quit
22
ответ дан ephemient 25 August 2018 в 23:31
поделиться

Можете ли вы запустить терминал на удаленном компьютере и использовать kill -INT для отправки сигнала?

0
ответ дан Carl Norum 25 August 2018 в 23:31
поделиться

Попробуйте signal SIGINT в командной строке gdb.

1
ответ дан Martin v. Löwis 25 August 2018 в 23:31
поделиться

Похоже, вы делаете ctrl + c. Проблема заключается в том, что ваше оконное окно отправляет SIGINT в процесс ssh, выполняемый локально, а не в процесс на удаленной системе.

Вам нужно будет указать сигнал вручную с помощью команды kill или системы вызовите удаленную систему.

или более удобно с помощью killall

$killall -INT gdb
1
ответ дан Mike 25 August 2018 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: