如何在GDB命令文件中检测断点并停止执行?

时间:2019-09-10 08:12:52

标签: debugging gdb

我正在尝试使用GDB命令文件实现单步执行。每当遇到任何断点时,我都希望停止执行命令文件。

有没有办法检测到断点被击中?以及在那之后如何停止执行命令文件。

我检查了文件,看来我只能对某些断点使用break命令。但不是为了随机断点。

我有这样的东西:

printf "single stepping\n"
set $steps_count = 0
     while ($steps_count < 5)
         set $steps_count = $steps_count + 1
          printf "program counter 0x%x\n", $pc
         printf "next #%d\n", $steps_count
         next
     end

这是我想要实现的:

printf "single stepping\n"
set $steps_count = 0
     while (# breakpoint is not hit)
         set $steps_count = $steps_count + 1
          printf "program counter 0x%x\n", $pc
         printf "next #%d\n", $steps_count
         next
     end
# end the execution of the command file.

更新: 我尝试使用以下方法:

# set the end breakpoint
break *0x199e
commands
    stop 1 
    quit
end

break *0x1980
# set a certain once we encounter the first breakpoint
commands
    set $count = 0
    while $count < 5
        printf "#PC: 0x%x", $pc
        set $count = $count + 1
        stepi
    end
end

一旦第一个断点被击中,这应该开始记录程序计数器。但是我不知道为什么这个break命令不起作用。一旦击中断点,程序将停止并且不输入while循环!

更新: 根据gdb文档:

  

在恢复执行的命令之后,命令列表中的任何其他命令将被忽略。这是因为,无论何时恢复执行(即使是简单的下一步或步骤),您都可能会遇到另一个断点,该断点可能具有自己的命令列表,从而导致执行哪个列表含糊不清。

所以我认为在中断命令中放置具有 step next 的循环不是一个好主意。

1 个答案:

答案 0 :(得分:0)

尝试类似的东西:

commands 1-10 # for breakpoints number 1 through 10
set $breakpoint_hit = 1
end

然后在循环中检查。