在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”命令的主要内容,如果未能解决你的问题,请参考以下文章