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

如何在gdb会话期间找到Qt5信号源?,gdb,qt5,signals-slots,Gdb,Qt5,Signals Slots,我已经在插槽方法上设置了断点,并启动了gdb来调试我的Qt5应用程序。我想知道从代码中的何处调用此插槽(通过Qt5信号系统) 我的天真方法以程序在断点处暂停而告终,但堆栈跟踪都是Qt5内部,不知道程序的哪个部分实际将信号发送到此插槽(或者它是排队调用还是直接调用: 这可能吗?怎么可能 谢谢!猜测信号和插槽是通过Qt::QueuedConnection连接的,在这种情况下,我通常会在连接到该插槽的每个信号发射中放置一个断点,如果它们不是太多的话 如果您临时将其设置为Qt::DirectConne

我已经在插槽方法上设置了断点,并启动了gdb来调试我的Qt5应用程序。我想知道从代码中的何处调用此插槽(通过Qt5信号系统)

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

这可能吗?怎么可能


谢谢!

猜测信号和插槽是通过
Qt::QueuedConnection连接的,在这种情况下,我通常会在连接到该插槽的每个信号发射中放置一个断点,如果它们不是太多的话


如果您临时将其设置为
Qt::DirectConnection
(或者
Qt::BlockingQueuedConnection
如果跨线程),您应该能够在发射器线程的堆栈跟踪中看到发射,等待插槽完成。

已更新

只有在连接排队时,才能在堆栈回溯中看到信号调用方

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

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()
...
这将为您提供发送信号的对象的类名。您可以将其转换为宏,并在代码中添加


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

不幸的是,它们太多了,需要每秒持续运行几次。在调试会话中显示一个简单的字符串将是一件好事。我想知道为什么这在qt的调试版本中不能作为调试辅助工具。也许你应该标记一些有用的字符串答案被接受是为了让其他用户更愿意提供帮助。答案只有一个,我希望得到的是一个实际的答案,而不是建议。当然,我会告诉你最好的选择,但我现在说得有点早。我不仅仅是说这个问题。我也是。看看日期。尝试创建一个全局
QSignalSpy
当通过插槽时,在调试器中检查它的值。它也不会告诉您源位置,只是列出了发出的信号。我走了这么远,但是我打开了悬赏(OP要求的)的解决方案是为了获得信号发出的实际行(当然是在gdb的帮助下)。@Alan,我更新了答案。我现在想不出更好的办法了
QString __sender__ = sender()->metaObject()->className();