Что делает gdb / dbx, когда ddd "ждет, когда он будет готов"? - PullRequest
2 голосов
/ 18 октября 2011

Я использую ddd в качестве внешнего интерфейса как для gdb, так и для dbx для программ на C ++.

Довольно часто, без какой-либо видимой причины, я пытаюсь next, и он будет зависать с сообщением "Ожидание готовности gdb" или "Ожидание готовности dbx".

Кто-нибудь знает , что они делают , что требует вечности и не дает видимых результатов? И я могу остановить это ?

Имейте в виду, что уже загружено достаточно материала, который я с радостью прошёл минутой раньше в том же процессе (и в той же функции), поэтому, что бы они ни делали, похоже, не было необходимо для этого. Кроме того, тот факт, что и ddd, и dbx имеют одинаковый шаблон поведения (во многих различных исполняемых файлах и на разных платформах), заставляет меня думать, что это что-то в данных, а не ошибка в любом отладчике.

1 Ответ

4 голосов
/ 01 февраля 2012

GDB (и то же самое относится к DBX) связывается с DDD с помощью протокола MI, который является стандартизированным и однозначным эквивалентом интерфейса командной строки.

Примечание: по умолчанию в моей системе (Fedora 15), по-видимому, они взаимодействуют напрямую с помощью интерфейса командной строки, но я заметил только ту проблему, которую вы описываете с --interpret=mi.

Например, вот соответствующий вывод для получения списка потоков:

(gdb) info threads 
  Id   Target Id         Frame   
2    Thread 0x7ffff7fd2700 (LWP 9191) "philosophers" 0x00000037dcc0b4c5 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0  
1    Thread 0x7ffff7fd3720 (LWP 9182) "philosophers" 0x00000037dc8df461 in clone ()   from /lib64/libc.so.6

(gdb) -thread-info 
^done,threads=[
   {id="2",target-id="Thread 0x7ffff7fd2700 (LWP 9525)",name="philosophers",
    frame={level="0",addr="0x0000000000400b31",
           func="chopsticks_put",
           args=[{name="i",value="0"}],
           file="chopsticks.c",fullname="philosphers/chopsticks.c",line="70"},
    state="stopped",core="2"},
   {id="1",target-id="Thread 0x7ffff7fd3720 (LWP 9522)",name="philosophers",
    frame={...},
    state="stopped",core="1"
   }],current-thread-id="3"

Так что то, что вы увидите в DDD, будет очень похоже на то, что доступно в CLI, отличается только «уровень представления».

По моему опыту, большинство команд GDB очень быстрые, по крайней мере, когда они не зависят от выполнения отладчиком (например, next вместо sleep(5)). Таким образом, есть две возможности для вашей проблемы:

  • ошибка в сообщении: например, тег ^done пропущен DDD или забыт GDB, поэтому DDD напрасно ждет завершения своего запроса
  • DDD запрашивает у GDB много данных, таких как определение структур, расположение функций или содержимое памяти и т. Д. (Например, из-за элементов, которые вы хотите просмотреть), поэтому потребуется некоторое время для вычисления информации GDB и передачи ее в DDD.

В нижней части DDD у вас есть GDB console. Попробуйте ввести там несколько команд GDB. Если GDB отвечает правильно (мой случай), это означает, что DDD больше не синхронизируется с GDB. (DDD стареет, 2009/02/11, и Eclise широко использует MI, поэтому я думаю, что мы знаем, кого обвинить ...!)

...