gdb是如何连接到多线程进程的

How does gdb attach to multi-threaded process?

本文关键字:多线程 进程 连接 何连接 gdb      更新时间:2023-10-16

我会尽量具体,但到目前为止,我已经把这个问题写得很糟糕,谷歌未能返回任何有用的结果(因此我的问题在这里)。

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

首先,在等待断点被击中(在' continue '模式下)时,我突然得到了(gdb)提示信息:

<>之前继续。[线程0x54d5b940 (LWP 28503)退出][新线程0x54d5b940 (LWP 28726)]无法获取线程事件消息:调试器服务失败之前

第二个,也是在等待断点被命中时,我突然被告知程序已经接收到SIGSEGV,并且-回到(gdb)提示- backtrace告诉我在pthread_cancel()中发生了段错误。注意,被调查的进程通常不会出现段故障。

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

  1. gdb attach
  2. 打破MyFunction ()

想法吗?谢谢。

我与类似的gdb问题斗争了一段时间。我的例子是有很多线程产生,执行几个函数,然后退出。

它似乎如果一个线程退出太快,有很多这些发生有时gdb无法跟上,当它失败时,它失败的风格在崩溃:)我认为它试图附加到一个线程,已经按照错误信息完成。

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

我的建议是寻找这个用例或类似的。一旦我改变我的设计,有一个线程服务的请求队列gdb工作完美。

从设计上讲,创建线程来消化操作比总是生成新线程更健康。

同样的代码在Visual Studio上调试没有问题,所以我不得不说这对我来说是一个关于gdb的小失望。

我使用Eclipse并查看GDB跟踪(通常在默认情况下启用)将为您提供更好的提示,说明GDB在哪里失败。控制台上的一个按钮显示了GDB跟踪。