如何在 gdb 会话期间找到 Qt5 信号的来源?

Len*_*and 4 gdb signals-slots qt5

我在方法上设置了一个断点并启动gdb来调试我的Qt5应用程序。我想知道从代码中的哪个位置调用这个插槽(通过 Qt5信号系统)。

我天真的方法以在断点处暂停程序而告终,但堆栈跟踪都是 Qt5 内部结构,不知道程序的哪个部分实际将信号发送到这个插槽(或者天气它是一个排队或直接调用:

在此处输入图片说明

这是可能吗?如何?

谢谢!

Inn*_*der 5

更新

唯一一次您不会在堆栈回溯中看到信号调用者的时间是连接排队时。

对于直接连接,您应该看到如下内容:

0 Receiver::baz()           <-- slot function that received the signal
1 Receiver::qt_static_metacall()
2 QMetaObject::activate()
3 Sender::bar()             <-- function with the name of the signal
4 Sender::foo()             <-- function that called emit
5 QWidget::event()
...
Run Code Online (Sandbox Code Playgroud)

对于排队连接,情况更为复杂。但是您可以将以下内容添加到您的插槽中:

QString __sender__ = sender()->metaObject()->className();
Run Code Online (Sandbox Code Playgroud)

这将为您提供发送信号的对象的类名。你可以把它变成一个宏并洒在你的代码中。

或者,如果您有多个同一类的对象,并且需要知道哪个发送了信号,则可以使用该sender()函数并比较对象地址等。