我目前有一个二进制程序,通常在使用一段时间后就会冻结。
例如,我正在使用以下命令执行这样的程序:
LD_LIBRARY_PATH=/arquivos/Gtk+-3.4.0/lib/:/xorg/X11-1.4.4/lib/:/xorg/Xcb-1.4/lib/:/arquivos/Dbus-1.10.2/lib gdb ./firefox
P.S:我加载这些库是因为我的系统缺少其中一些库或其中的一些符号。
然后在 gdb 中输入“run”,Firefox 就会加载。使用一段时间后,它可能会完全冻结(通常如此),背景变成纯色。通常,在我使用鼠标抓住右侧的上滚/下滚栏并快速上下移动它之后不久,就会发生这种情况。
发生冻结时 Gdb 不会告诉我任何信息
这个相同的 firefox 二进制文件在其他 Linux 上工作正常,所以我相信问题是由它与 LD_LIBRARY_PATH 加载的一些库的交互引起的。我确实使用不同版本的 X11 和 Xcb 进行了测试(尽管两者都是使用相同的 Xorgproto、Xau 和 pthread 存根构建的)。但一切都没有改变。
所以我有点不知道哪个图书馆是罪魁祸首,并愿意接受建议。
发生冻结时 Gdb 不会告诉我任何信息
不幸的是,您可能无法能够调试它,因为这样做需要了解
X11
事件调度的工作原理。 firefox
很可能被阻塞,等待一些 XEvent
被交付,甚至永远不会到来。
也就是说,通过使用 Control-C 重新获得 (gdb)
提示并使用
thread apply all where
命令,您可以获得有关二进制文件卡在哪里的额外信息。
这会告诉你所有线程在哪里。一旦你有了这个,你就会发现每个线程都在等待某些东西。弄清楚哪个线程正在等待什么最终会导致理解问题,但是弄清楚需要了解
firefox
本身和 X11
库的内部结构,而您似乎还没有。