Debugging 将GDB配置为仅加载特定符号

Debugging 将GDB配置为仅加载特定符号,debugging,gdb,debug-symbols,gdbinit,Debugging,Gdb,Debug Symbols,Gdbinit,我有一个巨大的整体,有100多个共享库。其中一些是如此巨大,如果我让GDB加载所有的符号,几乎所有的PC RAM都被填满了,我什么也做不了。所以我想禁用加载所有库,只加载我需要的库。我通过两个步骤来实现这一点: 禁用加载所有符号 set auto-solib-add off 应用程序启动后,只加载所需的库 shared /opt/build/Bin/drivers/* 现在,我的目的是使用.gdbinit文件(也由我的IDE、QtCreator加载)来自动执行此操作。但是,如果命令是在GD

我有一个巨大的整体,有100多个共享库。其中一些是如此巨大,如果我让GDB加载所有的符号,几乎所有的PC RAM都被填满了,我什么也做不了。所以我想禁用加载所有库,只加载我需要的库。我通过两个步骤来实现这一点:

禁用加载所有符号

set auto-solib-add off
应用程序启动后,只加载所需的库

shared /opt/build/Bin/drivers/* 
现在,我的目的是使用.gdbinit文件(也由我的IDE、QtCreator加载)来自动执行此操作。但是,如果命令是在GDB启动期间执行的,我不知道如何在不知道是否加载了相应的库的情况下执行第二个命令。非常感谢您的帮助。多谢各位

我不知道如何在不知道 相应的库被加载

如果启动程序并在
main
开头停止,则应加载所有动态链接库。大多数情况下,在
shared…
命令之前添加
start
命令即可加载库。另请参见此问题中的详细示例:

似乎无法在主目录init文件中使用
start
命令,因为尚未读取符号,因此无法在
main
上设置临时断点。另一个选项是在当前工作目录中创建一个单独的init文件,并在其中放置3个命令:

set auto-solib-add off
start
shared /opt/build/Bin/drivers/* 
发件人:

  • 读取主目录中的init文件(如果有),并执行该文件中的所有命令
  • 处理命令行选项和操作数
  • 从当前工作目录中的init文件(如果有)读取并执行命令

  • 在步骤4中,正在读取符号,您可以从那时起使用
    start
    命令。但在第3步中,符号尚未读取,您无法使用
    start
    命令。

    感谢您提供有关“开始”的提示。翻阅它的文档,听起来正是我需要的。我将我的gdbinit配置为:“设置自动solib加载、启动、共享mylib”。但是在应用程序加载之后,我注意到我的库(mylib)的符号仍然没有加载,这表明只有第一个命令生效,而忽略了其余的命令。我甚至不会像使用“开始”时所期望的那样在main处中断。我做错了什么?您可能有一个没有任何符号的剥离二进制文件,包括
    main
    。尝试在
    main
    上设置断点。另外,
    shared
    命令的正则表达式看起来不像正则表达式。它应该类似于
    /opt/build/Bin/drivers/*
    。否。如问题所述,我没有任何精简的库。这正是我开始寻找不加载所有符号的方法的原因。同样关于regex,当我在GDB终端上尝试“shared/opt/build/Bin/drivers/*”时,它工作得很好。我唯一的问题是如何使用GDBInit文件来完成这些工作。谢谢你的参考。我必须为GDB设置几个其他选项来读取第二个init文件。我最终在main中断,但仍然没有加载所需的符号。就这一点而言,我现在认为我开始做的事情毫无意义。这些库基本上都没有加载。当执行到达这些LIB加载到内存中的位置时,首先加载它们。因此,考虑到这种随机行为,我的最佳选择是在我确定这些lib已被读取之后,从IDE的gdb终端手动加载所需的库。您同意吗?同意,您还可以尝试将断点设置为已加载这些LIB的位置,并从那里加载符号。这就是用
    b
    +
    run
    代替
    start