2

我正在尝试定义一系列命令,应在 gdb 中的断点后调用:

    break some_function
    commands
       up
       next
       printf "some_string"
       continue
    end

在这种情况下(例如)我想在 some_function 处中断,在堆栈帧中向上并通过下一个命令跳转到该函数的后面,然后打印“some_string”(或者可能是某个变量,由函数更改)和然后只是继续。但这不起作用,因为 gdb 将在下一个命令之后停止并等待用户输入某些内容,而忽略以下命令。

编辑:好的,我上面给出的例子不符合我的描述。我真正想要的(感谢评论者尼古拉,见下文)是这样的:

    break some_function
    commands
       finish
       printf "some_string"
       continue
    end

这将在“some_function”处中断,执行该函数,在“some_function”执行后立即返回并打印字符串“some_string”。我之前使用下一个命令时遇到的问题现在出现在完成命令中:执行将在此命令后停止,gdb 将等待用户输入,而忽略以下 printf 和 continue 语句。对不起,这个问题有点混乱。我自己对此并不满意,但再次发布它不会是一个更好的解决方案(因为评论会丢失并且会交叉发布)。

4

2 回答 2

2

好的,我想我自己找到了答案:gdb 似乎在内部设置了一个断点来完成和下一个命令。但是,可以定义一个钩子,以克服在此断点处的中断。我认为最好的方法是生成自己的完成版本(或下一个命令)以避免副作用,所以这是可以做的:

    define myfinish
      finish
    end

    define hook-myfinish
      printf "some_string"
      continue
    end

    break some_function
    commands
      myfinish
    end

建议使用silent中断命令部分开头的语句,以在中断时抑制附加输出:

    break some_function
    commands
      silent
      myfinish
    end
于 2013-01-10T16:47:39.123 回答
1

为什么不简单地打破some_function+0x4或类似的偏移量?要知道正确的偏移量,请单击下一次,并记下偏移量...

break some_function+0x4
commands
   up
   printf "some_string"
   continue
end
于 2013-01-10T15:43:51.203 回答