C++ 运行时在共享库中调试/跟踪?

C++ 运行时在共享库中调试/跟踪?,c++,debugging,gdb,shared-libraries,C++,Debugging,Gdb,Shared Libraries,我想了解某个图书馆是如何运作的。我用我添加的原则编译了它,一切都很好。现在我想在运行时停止示例程序,查看调用堆栈,但我不太明白如何使用gdb来完成。我想打开的函数位于共享库中。我已经在这里复习了一篇文章,但是这种方法对我不起作用。所讨论的语言是C++。我试图提供文件名和行号,但gdb拒绝理解,它只列出了演示应用程序中的源文件 有什么建议吗?你可以先做“断网”。当你击中它时,共享库应该被加载,然后你可以在它的任何例程中设置断点。 < P>有两个案例要考虑(并且你的问题没有弄清楚你有哪一个案例):

我想了解某个图书馆是如何运作的。我用我添加的原则编译了它,一切都很好。现在我想在运行时停止示例程序,查看调用堆栈,但我不太明白如何使用gdb来完成。我想打开的函数位于共享库中。我已经在这里复习了一篇文章,但是这种方法对我不起作用。所讨论的语言是C++。我试图提供文件名和行号,但gdb拒绝理解,它只列出了演示应用程序中的源文件


有什么建议吗?

你可以先做“断网”。当你击中它时,共享库应该被加载,然后你可以在它的任何例程中设置断点。

< P>有两个案例要考虑(并且你的问题没有弄清楚你有哪一个案例):
-您的可执行文件直接链接到共享库:
这意味着当您在main上停止时,
GDB
将“看到”共享库中的符号(和源代码)
-可执行文件动态加载共享库(例如,通过
dlopen
):
在这种情况下,
GDB
dlopen
完成之前不会“看到”您的共享库

既然你在main停车时看不到符号,我猜你有第二种情况。 您可以在
(gdb)
提示符下执行
“在solib事件1上设置停止”
,并且
gdb
将在每次加载(或卸载)新的共享库时停止

您可以通过
info shared
命令查看哪些库
GDB
“知道”哪些库。
只需等待,直到您在该列表中看到您的目标库,然后再尝试在其中设置断点。

检查以下内容:

它将跟踪您的库调用-可能很有用

“strace”对系统调用也有同样的作用


这样你就可以找到一个切入点。。。您可以用这种方式在GDB中设置断点(尽管我自己无法解释细节)

是的,但是请确保您在编译该库时使用了-g,并且关闭了优化!不幸的是,这没有帮助。该函数仍然不可见,即使从main也不可见。有什么我可以添加到代码中,以使执行停止并进入调试器吗?@EightyEight:Hmm,这对我很有用。您试图调试的库是否可能通过dlopen()动态加载?这也许可以解释为什么它在主屏幕上仍然不可见。如果是这种情况,可以在目标库的dlopen调用之后设置初始断点,然后设置最终断点。似乎应该有一个更简单的方法;我会继续查找。顺便说一句,在我的应用程序中,如果我在输入main()之前尝试在共享库中设置断点,GDB会提供在将来加载共享库时挂起断点的功能。但如果我接受这一点,它似乎不会解决断点,即使在加载库之后也是如此。我想这也是你看到的?是的,我不得不用-g重新编译库。出于某种原因,它仍然不喜欢Class::Function()表示法,但File.cpp:linenumber的工作方式很有魅力。在调试Oracle的SQLPlus客户端应用程序时,此解决方案将不起作用