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

在gdb上调试应用程序时,是否可以插入不同版本的.so文件?,gdb,Gdb,我有一个rtl模拟运行,模拟器可执行文件加载了许多共享对象。有一个这样的对象,它具有在模拟期间调用的各种pli例程的定义。我对调试一个特定文件中的函数感兴趣。所以文件,让我说这是例程。所以。我已经编译了一个版本的例程。因此支持调试。现在模拟已经在运行,我已经将gdb进程附加到模拟器可执行文件。它正在从发布区获取例程。我想知道是否有一种方法可以插入调试版本的例程。那么在当前的gdb会话中插入?我知道我可以随时重新启动模拟,并从一开始就选择调试版本,但这些模拟需要几个小时才能到达关注点,所以我只是在

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

我想知道是否有办法插入例程的调试版本。那么在当前的gdb会话中呢

除非模拟器允许卸载和重新加载
例程

这些模拟需要几个小时才能到达关注点,所以我只是在想我是否可以在飞行中替换一个例程。那么

不可以。您可以做的是构建
例程的发布版本。因此
带有调试信息:

gcc -g -fPIC -O2 routines.c -shared -o routines.so
(将
-O2
替换为用于构建发布版本的任何标志)

然后使用
(gdb)将符号文件/path/to/release-g/routines.so$load\u address
(将
$load\u address
替换为您从
(gdb)info shared routines.so
获得的地址)

这将允许您在源代码级别调试“兴趣点”。这不如调试未优化的版本(代码可能会跳转,变量可能会优化,等等),但比在程序集级别调试要好得多

将来,如果您在ELF平台上,您应该构建
例程。因此
使用,这样您就可以随时调试它