如何用GDB快速定位首个返回指定错误码的函数?
定位首个返回ERROR_INTERNAL的底层函数(GDB调试方法)
步骤1:获取ERROR_INTERNAL的实际数值
启动GDB加载目标程序后,执行以下命令获取宏对应的整数:
p ERROR_INTERNAL
如果编译时带了调试信息,GDB会直接返回该宏的具体值(比如$1 = -1)。若未带调试信息,需手动查阅头文件中的宏定义获取数值。
步骤2:设置条件断点拦截错误返回
有两种高效方式拦截返回ERROR_INTERNAL的函数:
方式一:拦截所有返回该错误码的函数返回事件
使用GDB的catch return捕获函数返回动作,再添加条件过滤:
catch return condition $bpnum $_retval == ERROR_INTERNAL
$bpnum是刚创建的catch断点的编号(GDB会自动提示,也可通过info breakpoints查看)$_retval是GDB内置变量,代表当前函数的返回值
方式二:直接匹配源码中返回ERROR_INTERNAL的行
如果代码风格规范,可通过正则匹配所有包含return ERROR_INTERNAL;的行并设断点:
rbreak ^.*return.*ERROR_INTERNAL;$
步骤3:触发错误并定位底层函数
运行程序触发错误场景:
run
当断点命中时,执行以下命令查看调用栈:
bt
此时显示的当前函数就是返回ERROR_INTERNAL的函数,第一个命中的断点对应的函数即为最底层首个返回该错误的函数。若后续上层函数因传递该错误码再次触发断点,可通过调用栈区分层级。
内容的提问来源于stack exchange,提问作者Lewis Chan
相关产品推荐
相关产品推荐

