Jos*_*ica 3 c debugging gdb ld-preload gcc-attribute
当我编写一个要与 一起使用的库时LD_PRELOAD,如何调试它的__attribute__((__constructor__))功能?它们似乎总是在 GDB 停止进程之前运行。作为 MCVE,运行以下命令:
cat > preflight.c <<EOF
#include <stdio.h>
#include <stdlib.h>
__attribute__((__constructor__))
void preflight(void) {
puts("Exiting from preflight");
exit(42);
}
EOF
gcc -g -fPIC -shared preflight.c -o preflight.so
gdb /bin/true -ex 'set environment LD_PRELOAD ./preflight.so' \
-ex 'set breakpoint pending on' \
-ex 'break preflight' \
-ex 'starti'
Run Code Online (Sandbox Code Playgroud)
GDB 输出的末尾将如下所示:
Function "preflight" not defined.
Breakpoint 1 (preflight) pending.
Starting program: /usr/bin/true
Exiting from preflight
During startup program exited with code 42.
(gdb)
Run Code Online (Sandbox Code Playgroud)
观察到该preflight函数在 GDB 停止程序之前运行,即使我尝试在其上设置断点,并且我使用了starti,它应该在第一条指令处中断。我需要做什么不同的事情才能让 GDB 在preflight函数处中断?
发生这种情况是因为默认情况下,GDB 使用 shell 来启动正在调试的程序,并且提供的环境变量set environment也适用于 shell,所以我的preflight函数在那里运行。GDB 不会调试 shell,因此当它运行到 shell 时,它不会停止它。有两种选择可以解决此问题:
set startup-with-shell off。set environment LD_PRELOAD ./preflight.so,做set exec-wrapper env LD_PRELOAD=./preflight.so。参考资料:GDB 的文档,第4.2 节“启动程序”和“4.4 程序环境”。
| 归档时间: |
|
| 查看次数: |
42 次 |
| 最近记录: |