在gdb上调试应用程序时是否可以插入不同版本的.so文件?

时间:2017-03-23 05:40:08

标签: gdb

我有一个rtl模拟运行,模拟器可执行文件加载了许多共享对象。有一个这样的对象具有在模拟期间调用的各种pli例程的定义。我有兴趣调试特定.so文件中的函数,让我说这是routines.so。我编译了一个带有调试支持的routines.so版本。现在模拟已经运行,我已经将gdb进程附加到模拟器可执行文件。它从发布区域获取routines.so。我想知道是否有办法在当前的gdb会话中插入debug version of routines.so?我知道我可以随时重新启动模拟并从头开始调试版本,但是这些模拟需要几个小时才能达到兴趣点所以我只是想我是否可以动态替换{{1 }}?

1 个答案:

答案 0 :(得分:0)

  

我想知道是否有办法在当前的gdb会话中插入例程的debugines.so的调试版本?

除非模拟器允许卸载和重新加载routines.so

  

这些模拟需要几个小时才能到达目的地,所以我只是在考虑是否可以直接替换例程。所以?

没有。您可以做的是使用调试信息构建routines.so 发布版本:

gcc -g -fPIC -O2 routines.c -shared -o routines.so

(将-O2替换为用于构建发行版本的任何标志。)

然后使用(gdb) add-symbol-file /path/to/release-g/routines.so $load_address(将$load_address替换为您从(gdb) info shared routines.so获得的{。}}。

这将允许您调试"兴趣点"在源级别。这不如调试非优化版本(代码可以跳转,变量可以优化等),但比在汇编级调试要好得多。

将来,如果您使用的是ELF平台,则应使用separate debuginfo files构建routines.so,以便随时进行调试。