我正在尝试开发一个 GDB python 扩展,它定义了一个启动新线程的命令,用户可以在其中检查任意类型的变量。我的 python 扩展的骨架是这样的:
import gdb
import threading
def plot_thread():
import time
while True:
print('Placeholder for a window event loop.')
time.sleep(1)
pass
pass
class PlotterCommand(gdb.Command):
def __init__(self):
super(PlotterCommand, self).__init__("plot",
gdb.COMMAND_DATA,
gdb.COMPLETE_SYMBOL)
self.dont_repeat()
pass
def invoke(self, arg, from_tty):
plot_thread_instance=threading.Thread(target=plot_thread)
plot_thread_instance.daemon=True
plot_thread_instance.start()
pass
pass
PlotterCommand()
可以看出,我在这里定义了一个绘图命令。当我尝试调试以下程序时,如果我出现以下情况,GDB 将挂起:
- 在procedure() 线程内的任意位置放置一个断点(例如,第9 行,在while 循环内)。
- 在 gdb 命中断点后运行命令plot 。
- 之后继续运行。
#include <iostream>
#include <thread>
using namespace std;
void procedure() {
cout << "before loop"<<endl;
while(1) {
cout << "loop iteration"<<endl;
}
}
int main() {
thread t(procedure);
t.join();
return 0;
}
最奇怪的是,如果我将此代码更改为在不启动线程的情况下调用procedure(),GDB 永远不会挂起(并且占位符消息仍按我的预期打印)。
到目前为止,我已经尝试使用 GDB 版本 7.5.1 和 7.10 运行此过程,但我总是遇到相同的行为。
我究竟做错了什么?GDB不支持守护线程吗?这似乎不符合文档第 23.2.2.1 节的建议:GDB 可能不是线程安全的,但我认为在启动这样一个愚蠢的守护线程后它不应该挂起。