c - 如何防止 gdb 在下一个命令后停止

标签 c debugging gdb

我正在尝试定义一个命令链,该命令将在 gdb 中的断点之后调用:

    break some_function
    commands
       up
       next
       printf "some_string"
       continue
    end

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

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

    break some_function
    commands
       finish
       printf "some_string"
       continue
    end

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

最佳答案

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

    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

关于c - 如何防止 gdb 在下一个命令后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14261404/

相关文章:

c - 如何使用 libssh 模块进行双重身份验证?

c - 如何在数组中间重新分配()?

linux - 从/dev/kmsg 进行内核调试

c - 尝试解析 xml 文件时出现段错误

linq - 调试 LINQ to SQL SubmitChanges()

c++ - gcc 是否有丢弃 -g 标志的选项?

当shared_ptr超出范围时c++崩溃......在成功运行至少100,000次之后

macos - 完全分解可执行二进制文件

c++ - GDB 断点在 asio socket->connect 调用后停止工作

c++ - 如何在 C/C++ 中使用 CAP_REWINDPAGE 作为 TWAIN api?