GDB(同样适用于 DBX)使用 MI 协议与 DDD 通信,这是一个标准化且明确的命令行界面等价物。
备注:我的系统(Fedora 15)中的默认设置似乎是它们直接使用 CLI 进行通信,但我只注意到您用--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 命令都非常快,至少在它们不依赖于被调试者执行时(例如 a next
over a sleep(5)
)。因此,您的问题有两种可能性:
- 通信中的错误:例如
^done
,DDD 遗漏了标签或 GDB 忘记了标签,因此 DDD 徒劳地等待其请求的终止
- DDD 向 GDB 询问大量数据,例如结构的定义、函数位置或内存内容等(例如因为您要查看的元素),因此 GDB 计算这些信息需要一些时间并转移到 DDD。
在 DDD 的底部,您有GDB console
. 尝试在那里输入一些 GDB 命令。如果 GDB 正确响应(我的情况),则意味着 DDD 不再与 GDB 同步。(DDD 变老了,2009/02/11,而 MI 被 Eclise 广泛使用,所以我想我们知道该怪谁……!)