程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了gdb 是否支持选择性的“auto-solib-add”?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决gdb 是否支持选择性的“auto-solib-add”??

开发过程中遇到gdb 是否支持选择性的“auto-solib-add”?的问题如何解决?下面主要结合日常开发的经验,给出你关于gdb 是否支持选择性的“auto-solib-add”?的解决方法建议,希望对你解决gdb 是否支持选择性的“auto-solib-add”?有所启发或帮助;

我正在调试一个大型命令行程序,它将在启动时加载许多 *.so 库。

如果 ongdb,则需要加载的符号过多,auto-solib-add 将挂起。因此,我们的最佳做法是关闭 .gdbinit 中的 sharedlibrary,并通过 sharedlibrary 手动加载所选库的符号。

有些 *.so 库在程序启动后我们无法立即运行 dosomething,因为这些库尚未加载。我们需要在程序中执行一个命令,比如 gdb,以触发这些库的加载。之后,这些库将在 sharedlibrarydosomething 中可见。

这在大多数调试场景中都有效,但在某些情况下我遇到了问题。通过 libfoo.so 加载的库之一称为 foo(),其 API dosomethingfoo() 期间执行。我如何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.soinfo shared 输出中not,则说明您没有准确描述您的程序,您的问题无法回答。

,

通过研究这篇文章,我明白了:https://developer.ibm.com/technologies/linux/tutorials/l-dynamic-libraries/

如果我们将三个库使用场景编号为:

  1. 静态库。
  2. 共享库动态链接。
  3. 共享库动态加载。

libfoo.so 的加载属于 3),dlopen 库用于触发从应用程序加载(但仍通过系统的动态链接器处理 2))。>

在程序启动后在 gdb 中运行以下内容将允许我们在每次动态加载时停止。

sharedlibrary libdl.so
b dlopen

我在 stage jstage k 之间寻找的点可能是在 dlopen 返回 libfoo.so 的调用方之后。

大佬总结

以上是大佬教程为你收集整理的gdb 是否支持选择性的“auto-solib-add”?全部内容,希望文章能够帮你解决gdb 是否支持选择性的“auto-solib-add”?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: