大佬教程收集整理的这篇文章主要介绍了gdb 是否支持选择性的“auto-solib-add”?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在调试一个大型命令行程序,它将在启动时加载许多 *.so 库。
如果 on
为 gdb
,则需要加载的符号过多,auto-solib-add
将挂起。因此,我们的最佳做法是关闭 .gdbinit
中的 sharedlibrary
,并通过 sharedlibrary
手动加载所选库的符号。
有些 *.so 库在程序启动后我们无法立即运行 dosomething
,因为这些库尚未加载。我们需要在程序中执行一个命令,比如 gdb
,以触发这些库的加载。之后,这些库将在 sharedlibrary
的 dosomething
中可见。
这在大多数调试场景中都有效,但在某些情况下我遇到了问题。通过 libfoo.so
加载的库之一称为 foo()
,其 API dosomething
在 foo()
期间执行。我如何在 dosomething
期间闯入 gdb
?换句话说,对于程序阶段的以下心理图像,我如何在 stage j
之后和 stage k
之前暂停 foo()
以便我可以在 * ...
* Stage i: In the main program interface,the command `dosomething` is issued. This will trigger the loading of some dynamic linked librarIEs,including `libfoo.so`.
* ...
* Stage j: `libfoo.so` is loaded.
* ...
* Stage k: `foo()` is executed.
* ...
* Stage l: The command `dosomething` finishes and returns the control to the user in the main program.
* ...
执行之前加载符号?
auto-solib-add
注意:由于某些技术原因,我也无法在主程序启动后和运行 dosomething
之前打开 stage j
以触发这些库的加载。否则,我知道这可能是一种解决方法,而不是尝试在 stage k
和 {{1}} 之间的最佳位置手动暂停。
我的心理形象是以下顺序发生:
您的心智模型不正确:如果您可以调用 foo()
,那么 定义 foo()
的库必须已经加载。没有“按需”加载 .so
文件——它们仅加载,因为直接针对 .so
的可执行链接(在这种情况下,.so
是在可执行文件的单个指令运行之前加载),或作为 dlopen()
调用的结果。
您可以通过在 foo()
的调用方上设置断点并使用 GDB info shared
命令检查所有加载的 .so
来验证这一点。
假设 libfoo.so
实际上已加载,您可以要求 GDB 使用 shared libfoo.so
命令为该库添加符号。之后,您将能够在 foo()
上设置断点。
如果 libfoo.so
在 info shared
输出中not,则说明您没有准确描述您的程序,您的问题无法回答。
通过研究这篇文章,我明白了:https://developer.ibm.com/technologies/linux/tutorials/l-dynamic-libraries/
如果我们将三个库使用场景编号为:
libfoo.so
的加载属于 3),dlopen
库用于触发从应用程序加载(但仍通过系统的动态链接器处理 2))。>
在程序启动后在 gdb
中运行以下内容将允许我们在每次动态加载时停止。
sharedlibrary libdl.so
b dlopen
我在 stage j
和 stage k
之间寻找的点可能是在 dlopen
返回 libfoo.so
的调用方之后。
以上是大佬教程为你收集整理的gdb 是否支持选择性的“auto-solib-add”?全部内容,希望文章能够帮你解决gdb 是否支持选择性的“auto-solib-add”?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。