2013-03-15 131 views
0

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

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

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

线调试器会提示以下错误: 没有可用的“0x40174c84”源。

那我该怎么办?

有什么建议吗?

谢谢。

回答

1

通过逐步运行,您实际上要求调试器进入phread_create()函数,当然您还没有该源代码。如果因为我怀疑你期望调试器会把你带到你的线程的源头,那么我有一些坏消息;它不以那种方式工作。

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

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

但是等待 - 在此期间,您的主线程已经跳入远方,您失去了控制权。你不能为此设置一个断点,因为每当遇到任何断点时你的程序都会被gdb挂起。

简而言之,它在阿森纳的一个正确的痛苦。

您可以在Eclipse中输入gdb命令。这有点帮助,因为你可以做一些事情,比如设置线程特定的断点,并将gdb设置为非停止模式和后台异步模式。这些总比没有好,但根据我的经验,并没有完成整个工作。更糟糕的是,Eclipse似乎完全不知道它们(我可能已经过时),因此您只能手工输入命令。在这种情况下,您最好不要在Eclipse中运行。

我建议你看看this。一个好的方法是在所有线程的开始处放入一个循环,其中循环条件是一些永远不会改变的变量。这样,当创建线程时,可以切换到它,设置所需的任何断点,然后自己更改循环变量的值,以便在继续线程时退出循环并运行到断点。

- EDIT--

似乎我过时了。看看this。看起来Eclipse现在知道不间断模式,并且线程特定的断点。那些在每个线程中都加入了一个catch-at-start睡眠循环(也许Eclipse现在可以解决这个问题)将使它可以容忍调试线程。