编写 GDB 脚本来收集数据

Posted

技术标签:

【中文标题】编写 GDB 脚本来收集数据【英文标题】:Writing GDB scripts to collect data 【发布时间】:2015-06-18 08:54:50 【问题描述】:

我需要print addresses of all local variables in C,为此我正在尝试使用 GDB 脚本。

我正在使用以下 gdb 脚本。首先,我在 main 处设置断点,一旦遇到,我在下一行设置断点,然后在程序的每一行 step 进入它。

甚至可以使用 next 代替 step 执行到下一行。但是我需要使用 step 来进入函数,因为 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 语句,仅在遇到用户定义的函数时执行 step,否则执行 next

commands 1
    while 1
       info locals
       b
       if   //function name belongs to a predefined set
         step
       else
         next
       end
    end
end

我想了解有关 GDB 脚本语言的更多信息,但找不到足够的资料。我还需要知道我们是否可以声明数组、字符串并对其进行比较和其他操作。

【问题讨论】:

skip 命令可以做你想做的事。 Skipping over functions and files 【参考方案1】:

我将列出程序中使用的函数和变量作为 它由我的 GCC 插件返回。

由于您有一个已声明的函数名称列表,因此在脚本的开头为列表中的每个函数添加断点,现在运行它,并在每次中断后运行您的逻辑以打印地址,然后继续。

例如:

程序:

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) 

【讨论】:

我将编写的代码非常庞大,接近几千行,每个函数中有许多函数和变量。 ***.com/questions/30887281/…我需要一种自动化的方式来做到这一点,这就是我使用gdb脚本的原因。程序运行时必须收集地址数据。

以上是关于编写 GDB 脚本来收集数据的主要内容,如果未能解决你的问题,请参考以下文章

makefile简单脚本编写和Linux调试器gdb的简单应用

gdb.execute阻止python脚本中的所有线程

如何编写 dtrace 脚本来转储 Solaris 10 上崩溃进程的堆栈?

Python大法之告别脚本小子系列—信息资产收集类脚本编写(下)

有没有办法使用纯 gdb 脚本来测试我们是不是在断点上?

针对数据库升级版本信息采集脚本编写