使用 Eclipse CDT 调试广泛的多线程程序:查找线程

Debugging broadly multithreaded programs with Eclipse CDT: Finding threads

TLDR:C 程序,数百个线程,Eclipse (Oxygen 3) CDT 带有冗长树的调试视图。如何搜索?

我正在调试我编写的一些软件(用 C,FWIW),可以生成数百个线程。其中大约 300 个是在启动时启动的,大约有 300 个是动态启动的,以便在运行时执行任务。在某些操作中,我可以拥有超过 500 个线程 运行。

在该软件的早期版本中,可以通过这样一种方式来调试问题,即在发生故障(例如段错误等)时只有少数线程 运行,因此它在 Debug 视图中查看线程列表并了解正在发生的事情是合理的。最近我在开始时启动了更多的线程,虽然这对性能有很大的好处,但这意味着我随时都会有一个太长的线程列表,无法手动查看。

如何根据我对线程的了解找到线程,即它以什么函数启动(传递给 pthread_create())?具体来说,如何搜索调试 window 中显示的树?或者,我找到了一种将此视图的内容复制到剪贴板的方法,但是(莫名其妙地)这只会复制可见的内容,而不是实际的树内容——我如何自动展开整个树以便复制它并在文本编辑器中搜索?单击小箭头将数百个线程中的每一个扩展到各自的调用堆栈是不合理的。

我正在 RHEL 6 平台上进行开发(长话短说,向现代化的迁移尚未完成),目前我发现升级到 Eclipse Oxygen 3a (4.7.3a) 之外的障碍,所以我就是这样做的暂时坚持。

编辑:我应该澄清一下——我确实可以在调试 window 中按 Ctrl-F,然后我会得到一个搜索对话框。然而,我真的难以置信地惊掉了下巴,它还 只搜索可见的内容 ,而不搜索树的实际内容。因此,为了使它有用,我仍然必须手动展开列表中的每个线程;似乎仍然没有执行此操作的命令。

似乎根本无法以实际有用的方式在 Eclipse 的调试视图中搜索线程列表。同样,"Find" 和 "Copy Stack" 函数(可通过右键单击访问)仅对 GUI 视图中可见的文本进行操作,而不是树的实际内容。

因此,据我所知,获取所需信息的唯一方法是通过调试器控制台视图直接查询 gdb:

thread apply all bt

当然,调试器控制台视图的内容不可直接搜索(与常规控制台和 Eclipse 中的大多数其他视图不同),因此必须将文本列表复制并粘贴到其他编辑器中并进行搜索,以找到我要找的线程。然后,根据该信息,我可以在“调试”列表中滚动到它,展开该线程的跟踪,然后继续调试。