gpt4 book ai didi

c++ - gdb如何附加到多线程进程?

转载 作者:太空狗 更新时间:2023-10-29 21:01:54 27 4
gpt4 key购买 nike

我会尽量具体,但到目前为止,我对这个问题的措辞太差,以至于 Google 未能返回任何有用的结果(因此我的问题在这里)。

我将 gdb 附加到多线程 C++ 服务器进程。我只能说,在尝试执行通常的 set-breakpoint-break-investigate 时发生了奇怪的事情。

首先,在等待命中断点时(在“继续”模式下),我突然返回 (gdb) 提示消息:

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

其次,同样在等待命中断点时,我突然被告知程序已收到 SIGSEGV 并且 - 返回到 (gdb) 提示符 - 回溯告诉我段错误发生在 pthread_cancel 中().请注意,正在调查的进程通常不会出现段错误。

我显然缺乏关于 gdb 如何工作的足够信息,甚至无法开始猜测正在发生的事情。我做错了什么吗?我每次采取的步骤都是一样的:

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

想法?谢谢。

最佳答案

我与类似的 gdb 问题斗争了一段时间。我的情况是产生了很多线程,这些线程执行了很少的函数然后退出了。

似乎如果一个线程退出得太快,并且有很多这样的事情发生,有时 gdb 无法跟上,当它失败时,它会以崩溃的方式失败 :) 我认为它会尝试附加到一个已经完成的线程根据错误消息。

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

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

明智的设计是已经创建了消化操作的线程比总是产生新线程更健康。

同样的代码在 Visual Studio 上调试没有问题,所以我不得不说,对于 gdb,这让我有点失望。

我使用 Eclipse 并查看 GDB 跟踪(通常默认启用)会给您更好的提示,让您知道 GDB 在哪里失败。控制台上的其中一个按钮向您显示 GDB 跟踪。

关于c++ - gdb如何附加到多线程进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16814706/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com