如何让GDB自定义脚本的输出随每条命令自动显示?
实现GDB自定义命令的自动显示(display)
你遇到的问题是因为display命令仅支持识别表达式(如变量、函数调用),而无法直接执行GDB自定义命令,所以直接输入disp print_custom_structure <variable_name>会被GDB当作符号查找,导致报错。下面提供三种可行的解决方法:
方法1:利用hook-stop钩子自动执行自定义命令
GDB的hook-stop会在程序每次停止(断点命中、单步执行等)时自动触发指定命令,适合全局自动打印的场景:
# 定义停止钩子,替换成你要打印的变量名 define hook-stop print_custom_structure my_custom_var end
- 若需要临时关闭自动打印,执行
disable hook-stop;重新开启用enable hook-stop - 如果要动态切换打印目标,可以提前设置一个GDB变量存储目标:
set $target = &my_custom_var define hook-stop print_custom_structure $target end
方法2:封装自定义打印逻辑为类型专属函数,配合display使用
将自定义打印逻辑绑定到目标数据类型,这样display该类型变量时会自动调用你的逻辑:
假设你的自定义结构类型为my_struct,先定义打印函数:
define print_my_struct # 这里替换成你的自定义打印逻辑 printf "自定义结构内容:\n" printf " 字段A: %d\n", $arg0->field_a printf " 字段B: %s\n", $arg0->field_b end # 为函数添加文档(可选) document print_my_struct 自定义打印my_struct类型变量 end # 将该函数绑定到my_struct类型 set print function print_my_struct for my_struct
之后直接执行display my_custom_var,GDB就会自动用你的自定义逻辑打印变量内容。
方法3:用eval包装自定义命令(临时方案)
通过eval将自定义命令转为display可识别的表达式,适合临时需求:
display (void)eval("print_custom_structure %s", "my_custom_var")
- 该方法会额外显示
$n = void的冗余信息,可执行set display null off隐藏
内容的提问来源于stack exchange,提问作者Bastian
相关产品推荐
相关产品推荐

