我第一次尝试调试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
上的gdb
和tty1
进行远程调试(没有要冻结的图形:) :)我能够发送next
和{step
之类的命令{1}}在断点之后但没有什么可看的(可以' t list
代码,检查堆栈,等等......)
那么在这种情况下能够调试的任何好技巧都可以吗?
由于
答案 0 :(得分:1)
在调试运行在您用于调试的同一服务器上的X程序时,通常会有锁定。例如,如果下级(正在调试的程序的gdb术语)执行服务器抓取 - 哎呀,gdb GUI(或终端或emacs等)将被锁定。
您进行更多程序化调试的想法很好,但很难让它完全正常工作。正如您所发现的,一些gdb命令(基本上与劣质控制相关的命令)在命令中不起作用。而且,它不是那么方便。
你可以更进一步。例如,您可以使用SystemTap来探测程序。
然而,也有更好的方法。
一种方法是使用虚拟X服务器运行劣质服务器 - 嵌套服务器或在VM中运行的虚拟服务器。然后你可以转到“外部”X服务器进行调试。这会更好。
另一种方法是拥有两台计算机,并在一台计算机上运行调试器,在另一台计算机上运行调试器。在某种程度上,这是真正相同的答案,只使用真机而不是虚拟机。
答案 1 :(得分:0)
问题是陈旧的,但对于任何可能正在努力解决这个问题的人来说,有一种方法可以通过禁用X服务器抓取来阻止冻结行为的发生。
您必须更改IDE中的配置以使用以下系统属性运行程序:
Person
如果您使用javaws(Java Web Start)来运行应用程序,请使用:
Dog
代替。