当 ddd "waiting for it to get ready"时,gdb/dbx 在做什么?

What is gdb/dbx doing when ddd is "waiting for it to get ready"?

本文关键字:dbx gdb 什么 ready for waiting ddd it to get      更新时间:2023-10-16

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

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

有谁知道他们在做什么花了很长时间却没有产生明显的结果吗?我能阻止它发生吗?

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

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))。所以你的问题有两种可能:

  • 通信中的错误:例如^done标签被DDD遗漏或被GDB忘记,因此DDD徒劳地等待其请求的终止
  • DDD向GDB请求大量的数据,如结构的定义、函数位置或内存内容等(例如,因为您想要监视的元素),因此GDB计算这些信息并将其传输到DDD需要一些时间。

在DDD的底部有GDB console。试着在里面输入一些GDB命令。如果GDB正确响应(我的例子),则意味着DDD不再与GDB同步。(DDD越来越老了,2009/02/11,而MI被eclipse广泛使用,所以我想我们知道谁应该受到指责…)