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