当ddd“等待它准备好”时,gdb / dbx正在做什么?

时间:2011-10-18 10:21:35

标签: c++ gdb dbx ddd-debugger

我使用ddd作为gdb和dbx for C ++程序的前端。

很多时候,没有任何明显的原因,我会尝试next,它会挂起“等待gdb准备好”或“等待dbx准备好”的消息。

是否有人知道他们正在做什么需要永远不会产生明显效果?并且我可以阻止发生吗?

请记住,已经加载了足够多的东西,我很高兴在同一个过程中(并且在同一个函数中)提前一分钟踩踏/连接,所以无论他们做什么似乎都没有必要的。此外,ddd和dbx都具有相同的行为模式(在许多不同的可执行文件和不同的平台上)这一事实使我认为它是数据中的某些东西,而不是任何调试器中的错误。

1 个答案:

答案 0 :(得分:4)

GDB(同样适用于DBX)使用MI协议与DDD进行通信,MI协议是命令行界面的标准化和明确的等效。

备注:我系统中的默认设置(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命令都非常快,至少在它们不依赖于调试对象执行时(比next超过sleep(5))。因此,您的问题有两种可能性:

  • 通信中的错误:例如,DDD错过了^done标记或GDB忘记了这个标记,因此DDD等待终止其请求
  • DDD向GDB请求很多数据,比如结构的定义,功能位置或内存内容等(例如因为你想要观看的元素),所以它需要有时候GDB计算信息并转移到DDD。

在DDD的底部,你有GDB console。尝试在那里键入一些GDB命令。如果GDB正确响应(我的情况),则意味着DDD不再与GDB同步。 (DDD正在变老,2009/02/11,Eclise广泛使用MI,所以我想我们知道谁应该受到指责......!)