调试GTK事件回调

时间:2014-07-25 04:44:38

标签: c debugging gdb gtk

我第一次尝试调试gtk代码,实际上,我想调试key-press-event的回调函数,所以我设置一个带gdb的断点,当它到达时断点,整个桌面版本都是冻结的(我在gnome-shell下运行)似乎图形环境正在等待事件结束。

我有些想法没有用:

第一次尝试是将一些gdb命令分配给断点:

(gdb) break on_key_press_callback
(gdb) commands
      > back trace
      > next
      > next
      > next
      > continue
      > end

但我不知道为什么,只执行back trace命令,然后冻结。

第二次尝试是使用gdbserver上的gdbtty1进行远程调试(没有要冻结的图形:) :)我能够发送next和{step之类的命令{1}}在断点之后但没有什么可看的(可以' t list代码,检查堆栈,等等......)

那么在这种情况下能够调试的任何好技巧都可以吗?

由于

2 个答案:

答案 0 :(得分:1)

在调试运行在您用于调试的同一服务器上的X程序时,通常会有锁定。例如,如果下级(正在调试的程序的gdb术语)执行服务器抓取 - 哎呀,gdb GUI(或终端或emacs等)将被锁定。

您进行更多程序化调试的想法很好,但很难让它完全正常工作。正如您所发现的,一些gdb命令(基本上与劣质控制相关的命令)在命令中不起作用。而且,它不是那么方便。

你可以更进一步。例如,您可以使用SystemTap来探测程序。

然而,也有更好的方法。

一种方法是使用虚拟X服务器运行劣质服务器 - 嵌套服务器或在VM中运行的虚拟服务器。然后你可以转到“外部”X服务器进行调试。这会更好。

另一种方法是拥有两台计算机,并在一台计算机上运行调试器,在另一台计算机上运行调试器。在某种程度上,这是真正相同的答案,只使用真机而不是虚拟机。

答案 1 :(得分:0)

问题是陈旧的,但对于任何可能正在努力解决这个问题的人来说,有一种方法可以通过禁用X服务器抓取来阻止冻结行为的发生。

您必须更改IDE中的配置以使用以下系统属性运行程序:

Person

如果您使用javaws(Java Web Start)来运行应用程序,请使用:

Dog

代替。