在gdb脚本中使用“return”命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在gdb脚本中使用“return”命令相关的知识,希望对你有一定的参考价值。

我正在尝试自动化测试,其中我使函数返回错误。但是gdb“return(int)22”命令似乎没有被执行,并且程序以成功代码退出。是否有一些特殊的东西需要做才能使“return”命令在gdb脚本中工作?这是我正在使用的gdb脚本:

set width 0
set height 0
set confirm off
set pagination off
set verbose off
set breakpoint pending on

set args the program args

break file.c:function_in_which_to_break
commands 1
    return 22
    continue
end

run the program args
quit

我将使用以下gdb命令行运行该程序:

gdb --batch --command=rc my_program

期望的行为是“function_in_which_to_break”返回22.其余代码将继续向上传递调用堆栈,直到程序退出并且程序的退出代码应为22。

实际行为是程序的退出代码是成功的。

当我在终端的gdb下运行程序时(带命令)

gdb --args my_program the program args

),通过输入“break file.c:function_in_which_to_break”来中断file.c:function_in_which_to_break并运行,程序确实在那里中断。然后当我输入“return 22”和“continue”时,程序按照我的预期运行,函数返回22,程序返回22并显示我期望的故障。

更新:当我说程序返回“成功”时,我的意思是gdb报告孩子返回成功。当我说程序返回22时,我的意思是gdb报告孩子返回22(实际上它说“退出代码026”)。 gdb本身在两种情况下都会返回成功。

更新2:我在gdb调用的自动化中发现了一些错误 - 在带有拼写错误的名称的文件中查找“退出代码026”,调用拼写错误的gdb-rc脚本,这样的事情很愚蠢。修复后,命令中带有return语句的gdb脚本文件似乎可以正常工作。因此,只要有人写出“返回命令应该与所有其他命令一样工作”的答案,我会接受它。 @ ks1322

答案

实际行为是程序的退出代码是成功的。

根据documentation,您还应该使用-return-child-result选项运行gdb以获取正在调试的进程的返回代码:

-return-child-result

    The return code from GDB will be the return code from the child process (the process being debugged), with the following exceptions:

        GDB exits abnormally. E.g., due to an incorrect argument or an internal error. In this case the exit code is the same as it would have been without ‘-return-child-result’.
        The user quits with an explicit value. E.g., ‘quit 1’.
        The child process never runs, or is not allowed to terminate, in which case the exit code will be -1. 

    This option is useful in conjunction with ‘-batch’ or ‘-batch-silent’, when GDB is being used as a remote program loader or simulator interface.

更新: 看来,成功退出程序代码的真正原因是解析gdb输出时出现了一些错误。无论如何,使用-return-child-result并分析gdb退出代码,比解析文本输出更不容易出错,我猜。

是否有一些特殊的东西需要做才能使“return”命令在gdb脚本中工作?

似乎没有,但是恢复执行的命令有例外,有关详细信息,请参阅How to print Entering and Leaving for a function in gdb command?

以上是关于在gdb脚本中使用“return”命令的主要内容,如果未能解决你的问题,请参考以下文章

在 QtCreator 命令行上指定 GDB 启动脚本

在QtCreator命令行上指定GDB启动脚本

gdb中一些常用的调试命令

如何在日志文件中包含GDB命令?

从 shell 脚本中运行 gdb 命令

代码调试篇:如何编写 gdb 自定义命令