如何调试 LD_PRELOAD 库中的属性(构造函数)函数?

问题描述 投票:0回答:1

当我编写一个与

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

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) 

观察到

takeover
函数在 GDB 停止程序之前运行,即使我尝试在其上设置断点,并且我使用了
starti
,它应该在第一条指令处中断。我必须采取什么不同的措施才能让 GDB 在
preflight
函数处中断?

c debugging gdb ld-preload gcc-attribute
1个回答
0
投票

发生这种情况是因为默认情况下,GDB 使用 shell 来启动正在调试的程序,并且提供给

set environment
的环境变量也适用于 shell,所以我的
preflight
函数在那里运行。 GDB 不会调试 shell,因此当它运行到 shell 时,它不会停止它。有两种选择可以解决此问题:

  1. set startup-with-shell off
  2. 不要做
    set environment LD_PRELOAD ./preflight.so
    ,而是做
    set exec-wrapper env LD_PRELOAD=./preflight.so

参考资料:GDB 的文档,章节 4.2 启动您的程序4.4 您的程序环境

© www.soinside.com 2019 - 2024. All rights reserved.