如何使用gdb调试二进制c/c++程序?

问题描述 投票:0回答:1

我目前有一个二进制程序,通常在使用一段时间后就会冻结。

例如,我正在使用以下命令执行这样的程序:

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 存根构建的)。但一切都没有改变。

所以我有点不知道哪个图书馆是罪魁祸首,并愿意接受建议。

c++ gdb
1个回答
0
投票

发生冻结时 Gdb 不会告诉我任何信息

不幸的是,您可能无法能够调试它,因为这样做需要了解

X11
事件调度的工作原理。
firefox
很可能被阻塞,等待一些
XEvent
被交付,甚至永远不会到来。

也就是说,通过使用 Control-C 重新获得 (gdb) 提示并使用

thread apply all where
命令,您
可以
获得有关二进制文件卡在哪里的额外信息。

这会告诉你所有线程在哪里。一旦你有了这个,你就会发现每个线程都在等待某些东西。弄清楚哪个线程正在等待什么最终会导致理解问题,但是弄清楚需要了解

firefox
本身和
X11
库的内部结构,而您似乎还没有。

© www.soinside.com 2019 - 2024. All rights reserved.