【问题标题】:Can we define a new data type in a GDB session我们可以在 GDB 会话中定义新的数据类型吗
【发布时间】:2011-11-08 12:14:14
【问题描述】:

有没有办法在 gdb 中定义新的数据类型(C 结构或联合)。这个想法是定义一个结构,然后让 gdb 从解释为新定义的结构的地址打印数据。

例如,假设我们有一个示例结构。

struct sample {
  int i;
  struct sample *less;
  struct sample *more;
}

如果 0x804b320 是 struct sample 数组的地址。该二进制文件没有调试信息,因此 gdb 可以理解 struct sample。有什么方法可以在 gdb 会话中定义 struct sample 吗?这样我们就可以打印p *(struct sample *)0x804b320

【问题讨论】:

    标签: gdb


    【解决方案1】:

    是的,这是如何进行的:

    // sample.h
    struct sample {
      int i;
      struct sample *less;
      struct sample *more;
    };
    
    // main.c
    #include <stdio.h>
    #include <assert.h>
    #include "sample.h"
    int main()
    {
      struct sample sm;
      sm.i = 42;
      sm.less = sm.more = &sm;
    
      printf("&sm = %p\n", &sm);
      assert(sm.i == 0);  // will fail
    }
    
    gcc main.c   # Note: no '-g' flag
    
    gdb -q ./a.out
    (gdb) run
    &sm = 0x7fffffffd6b0
    a.out: main.c:11: main: Assertion `sm.i == 0' failed.
    
    Program received signal SIGABRT, Aborted.
    0x00007ffff7a8da75 in raise ()
    (gdb) fr 3
    #3  0x00000000004005cc in main ()
    

    没有局部变量,没有类型struct sample

    (gdb) p sm
    No symbol "sm" in current context.
    (gdb) p (struct sample *)0x7fffffffd6b0
    No struct type named sample.
    

    所以我们开始工作了:

    // sample.c
    #include "sample.h"
    struct sample foo;
    
    gcc -g -c sample.c
    
    (gdb) add-symbol-file sample.o 0
    add symbol table from file "sample.o" at
        .text_addr = 0x0
    
    (gdb) p (struct sample *)0x7fffffffd6b0
    $1 = (struct sample *) 0x7fffffffd6b0
    (gdb) p *$1
    $2 = {i = 42, less = 0x7fffffffd6b0, more = 0x7fffffffd6b0}
    

    瞧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多