繁体   English   中英

gdb如何附加到多线程进程?

[英]How does gdb attach to multi-threaded process?

我将尝试尽可能具体,但到目前为止,我已经措辞这个问题,以至于谷歌未能返回任何有用的结果(因此我的问题在这里)。

我将gdb附加到多线程c ++服务器进程。 我可以说的是,在尝试进行通常的set-breakpoint-break-investigation时,发生了奇怪的事情。

首先 ,在等待断点被击中时(在“继续”模式下),我突然回复了(gdb)提示符并显示以下消息:

Continuing.
[Thread 0x54d5b940 (LWP 28503) exited]
[New Thread 0x54d5b940 (LWP 28726)]
Cannot get thread event message: debugger service failed

第二 ,同样在等待断点被击中时,我突然告诉程序已收到SIGSEGV并且 - 回到(gdb)提示符 - backtrace告诉我在pthread_cancel()中发生了段错误。 请注意,正在调查的过程通常不会发生段错误。

我显然缺乏关于gdb如何工作甚至开始猜测发生了什么的足够信息。 我做错了吗? 我每次采取的步骤都是相同的:

  1. gdb附加
  2. 打破'MyFunction()'
  3. 继续

思考? 谢谢。

我和类似的gdb问题争了一段时间。 我的情况是产生了许多执行少量功能然后退出的线程。

看起来如果一个线程退出太快并且有很多这种情况发生,有时gdb无法跟上,当它失败时,它会失败,因为崩溃中的样式:)我认为它试图附加到已根据错误完成的线程信息。

我认为这是gdb 6.5到7.6中的一个问题,并且仍在发生。 没试过旧版本。

我的建议是寻找这个用例或类似用例。 一旦我改变了我的设计,让一个线程服务于一个请求队列,gdb就可以完美地运行。

设计方面更健康的是已经创建了消化动作的线程而不是总是产生新线程。

仍然相同的代码调试Visual Studio没有问题,所以我不得不说,对于我来说,对gdb有点失望。

我使用Eclipse并查看GDB跟踪(通常默认启用)将为您提供更好的GDB失败位置的提示。 控制台上的一个按钮显示GDB跟踪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM