您使用/编写了哪些有用的GDB脚本?

时间:2009-07-07 19:14:54

标签: debugging scripting gdb

人们使用gdb开启和关闭进行调试, 当然还有很多其他的调试工具 各种操作系统with and without GUI and, maybe other fancy IDE features

我想知道 what useful gdb scripts you have written and liked 虽然,我并不是指在something.gdb文件中转储一些命令,而这些命令是您提供的,以便提取大量数据,如果这样做了,请继续讨论它。

  • 让我们想一下条件处理控制循环函数,以便进行更优雅和精致的编程调试,甚至可以用于白盒测试< / LI>
  • 当您启动debugging remote systems(例如,通过串行/以太网接口)
  • 时,事情变得有趣
  • 并且,如果目标是多处理器(和多线程)系统
  • ,该怎么办?

让我以一个简单的案例为例...... 说,

  

在条目上串行遍历的脚本
  在大型哈希表中查找错误条目
  这是在嵌入式平台上实现的。

这帮我调试了一次破坏的哈希表。

3 个答案:

答案 0 :(得分:10)

这个脚本不是我写的,它可以打印STL容器,例如矢量,地图等:http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt

非常棒。

答案 1 :(得分:5)

调试AOLserver SIGSEGV崩溃时,我使用以下脚本检查GDB中的TCL级调用堆栈:

define tcl_stack_dump
  set $interp = *(Interp*)interp
  set $frame  = $interp->framePtr
  while (0 != (CallFrame *)$frame->callerPtr != 0)
    set $i = 0

    if 0 != $frame->objv
      while ($i < $frame->objc)
        if (0 != $frame->objv[$i] && 0 != $frame->objv[$i]->bytes)
          printf " %s", (char *)(CallFrame *)$frame->objv[$i]->bytes
        end

        set $i = $i + 1
      end
      printf "\n"
    end

    set $frame = (CallFrame *)$frame->callerPtr
  end
end

document tcl_stack_dump
  Print a list of TCL procs and arguments currently being called in an
  interpreter.  Most TCL C API functions beginning with Tcl[^_] will have a
  Tcl_Interp parameter.  Assumes the `interp' local C variable holds a
  Tcl_Interp which is represented internally as an Interp struct.

  See:
    ptype Interp
    ptype CallFrame
    ptype Proc
    ptype Command
    ptype Namespace
    ptype Tcl_Obj
end

答案 2 :(得分:3)

1。当试图让一些第三方闭源DLL在Mono下使用我们的项目时,它会产生毫无意义的错误。因此,我使用了Mono project

中的脚本

2. 我还有一个项目可以将自己的信息转储到 stdout 以便在GDB中使用,所以在断点处,我可以运行该函数,然后剪切-n-将其输出粘贴到GDB中。

[编辑]

3。我的大多数GCC / G ++使用已经有一段时间了,但我还记得使用宏来利用GDB知道我所拥有的一些不透明数据的成员这一事实(库是用debug编译的。这非常有帮助。

4。我也发现了这一点。它转储一个对象列表(来自全局“headMeterFix”SLL),其中包含另一个对象类型的动态数组。我在宏中使用嵌套循环的次数之一:

define showFixes
  set $i= headMeterFix
  set $n = 0
  while ($i != 0)
    set $p = $i->resolved_list
    set $x = $i->resolved_cnt
    set $j = 0 
    printf "%08x [%d] = {", $i, $x
    printf "%3d [%3d] %08x->%08x (D/R): %3d/%-3d - %3d/%-3d {", $n, $i, $x, $i->fix, $i->depend_cnt, dynArySizeDepList($i->depend_list), $i->resolved_cnt, dynArySizeDepList($i->resolved_list)
    while ($j < $x)
       printf " %08x", $p[$j]
       set $j=$j+1
    end
    printf " }\n"
    set $i = $i->next
    set $n = $n+1
  end
end