我需要print addresses of all local variables in C,为此我尝试使用GDB脚本。
我正在使用以下gdb脚本。首先我在main设置一个断点,一旦遇到断点,我在下一行设置一个断点,然后在程序的每一行步骤。
甚至可以使用 next 代替步骤执行直到下一行。但我需要使用步骤进入函数,因为下一步不会这样做。
b main
commands 1
while 1
info locals //some code needed to print addresses
b
step
end
end
run
但是,命令" step"也可以进入库函数。有没有办法运行" step"命令有条件地使它不进入库函数?我将在程序中使用的函数和变量列表由我的GCC Plugin返回。我是否可以使用仅在遇到用户定义函数时执行步骤的if语句,否则使用 next ?
commands 1
while 1
info locals
b
if //function name belongs to a predefined set
step
else
next
end
end
end
我想了解有关GDB脚本语言的更多信息,但我无法找到有关它的足够资料。我还需要知道我们是否可以声明数组,字符串并对它们执行比较和其他操作。
答案 0 :(得分:0)
我将在程序中使用一系列函数和变量 它由我的GCC插件返回。
由于你有一个你声明的函数名列表,在脚本的开头为列表中的每个函数添加断点,现在运行它,并在每次中断后运行你的逻辑来打印地址,然后继续。
例如:
PROG:
void fn1()
{
int j = 0;
printf("I am in fn 1");
}
void fn2()
{
int k = 0;
printf("I am in fn 2");
}
int main()
{
int i = 0;
fn1();
printf("I am in main");
fn2();
}
gdb成绩单:
(gdb) b main
Breakpoint 1 at 0x400575: file surya.c, line 15.
(gdb) b fn1
Breakpoint 2 at 0x400535: file surya.c, line 3.
(gdb) b fn2
Breakpoint 3 at 0x400555: file surya.c, line 9.
(gdb) r
Starting program: /home/mohit/test/a.out
warning: the debug information found in "/lib64/ld-2.19.so" does not match "/lib64/ld-linux-x86-64.so.2" (CRC mismatch).
Breakpoint 1, main () at surya.c:15
15 int i = 0;
(gdb) p &i
$1 = (int *) 0x7fffffffdf7c
(gdb) c
Continuing.
Breakpoint 2, fn1 () at surya.c:3
3 int j = 0;
(gdb) p &j
$2 = (int *) 0x7fffffffdf5c
(gdb) c
Continuing.
Breakpoint 3, fn2 () at surya.c:9
9 int k = 0;
(gdb) p &k
$3 = (int *) 0x7fffffffdf5c
(gdb)