2013-05-29 46 views
3

我会尽力确保尽可能具体,但到目前为止,我已经将这个问题描述得如此糟糕以至于Google未能返回任何有用的结果(因此我的问题在此处)。gdb如何连接到多线程进程?

我将gdb附加到多线程C++服务器进程。我只能说,在尝试进行通常的设置断点 - 断裂调查时,发生了奇怪的事情。

首先,在等待断点被打(在“继续”模式),我突然回来了(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. 继续

的思考?谢谢。

+0

我认为这是Linux吗?据我了解,它附加到可能有一个或多个线程的PROCESS。 –

+0

是的,对不起,红帽企业Linux版本5.4(Tikanga)。是的,它确实附着在流程上,流程确实有多个线程。 –

+1

对于第二个问题:由于调试器开销,在调试器下运行通常会更改线程的时序。这可能会触发现有的错误,这是不太可能被观察到的。 – languitar

回答

4

我与类似的gdb问题争斗了一段时间。我的情况是有大量的线程产生,执行很少的功能,然后退出。

它出现如果一个线程退出速度太快,有很多这样的情况发生有时gdb无法跟上,当它失败时,失败与样式崩溃:)我认为它试图附加到一个已经完成的线程根据错误消息。

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

我的建议是寻找这个用例或类似的东西。一旦我改变了我的设计,让一个线程为请求队列提供服务,gdb的工作完美无瑕。

明智的设计已经创建了消除动作的线程,而不是总是产生新的线程。

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

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