Linux远程调试线程错误(GDBServer)

时间:2013-03-15 16:48:52

标签: linux multithreading gdbserver

我有一个ARM设备,我想调试它。我的主机是Linux 12.04,我正在使用Eclipse。 GDBServer在我的目标设备上运行。

我可以调试单个进程应用程序。但是当我想调试包含pthread对象的多线程应用程序时,调试失败。 我一步一步地跑,但是当我来到

pthread_create(&timerSettings.timerThread, NULL, &timerThread, NULL);

行调试器给出了以下错误 没有可用于“0x40174c84”的源。

那我该怎么办?

有什么建议吗?

感谢。

1 个答案:

答案 0 :(得分:1)

通过逐步运行,实际上要求调试器进入phread_create()函数,当然你没有源代码。如果我怀疑你预计调试器会把你带到你的线程来源,那么,我有一些坏消息;它不起作用。

如果您跨越pthread_create(),它将创建您的线程,如果您处于Debugger透视图中,该线程应显示在Eclipse的任务列表中。你可以从那里选择你的线程。如果你这样做,源代码视图将跳转到该线程所到达的地方(更多的坏消息即将到来)。请记住,所有这些都需要相对现代版本的gdb(我记得6及以上)。

现在你的问题真的开始了。使用gdb中的线程进行调试并不是很好。选择线程时,您可能会发现没有显示源代码。这是因为虽然您已经跨过了pthread_create(),但这并不意味着该线程已经进展到第一行源代码。这是因为当gdb挂起程序时,该程序中的每个线程都被挂起,并且新线程可能还没有超出标准库的线程初始代码。因此,您必须在线程的第一行源代码中设置断点,并允许程序自由运行直到该断点被命中。

但是等等 - 与此同时,你的主线已经远远地跳到了远处,你已经失去了对它的控制。您无法在此设置断点,因为只要有任何断点,您的程序就会被gdb挂起。

简而言之,它在武器库中是一种正确的痛苦。

您可以在Eclipse中键入gdb命令。这有点帮助,因为您可以执行诸如设置线程特定断点之类的操作,并将gdb设置为非停止模式和后台异步模式。这些比没有好,但根据我的经验,不做整个工作。更糟糕的是,Eclipse似乎完全没有意识到它们(我可能已经过时了)所以你不得不手动输入命令。在这种情况下,你最好不要在Eclipse中运行。

我建议你看看this。一个好的技巧是在所有线程的开头将一个睡眠置于一个循环中,循环条件是一个永远不会改变的变量。这样,当创建线程时,您可以切换到它,设置您想要的任何断点,然后自己更改循环变量的值,这样当您继续该线程时,它退出循环并运行到您的断点。

- 编辑 -

似乎我已经过时了。看看this。看起来Eclipse现在知道不停止模式和特定于线程的断点。那些耦合了每个线程中的catch-at-start睡眠循环(也许Eclipse现在也可以解决这个问题)将使其可以容忍调试线程。

相关问题