如何在GDB的printf表达式中复用print命令的POD结构体格式化效果?
GDB自定义函数中格式化输出POD结构体的正确方法
你之前用printf "%s", l[0]失败是因为GDB的printf命令里%s只接受字符串指针,不能直接传入结构体,所以才会报"Value can't be converted to integer"的错误。想要实现和print命令一样的格式化效果,有两种实用方法:
方法一:直接在自定义函数里调用print命令
print本身就支持自动格式化POD结构体,完全可以直接在自定义函数里复用这个功能。比如定义一个简单的自定义函数:
define print_struct print $arg0 end
调用的时候直接传结构体变量就行:
print_struct l[0]
输出效果和print l[0]完全一致:
$9 = {rq = 10, eq = 0 }
方法二:用printf手动指定成员格式
如果一定要用printf来输出,需要逐个指定结构体成员和对应的格式符,比如针对你的结构体:
printf "{rq = %d, eq = %d }\n", l[0].rq, l[0].eq
要是封装成自定义函数,就用$arg0代表传入的结构体参数:
define printf_struct printf "{rq = %d, eq = %d }\n", $arg0.rq, $arg0.eq end
调用后也能得到格式化的输出:
{rq = 10, eq = 0 }
两种方法里,方法一更省心,尤其是结构体成员多或者类型复杂的时候,不用手动写每个成员的格式;方法二则适合需要自定义输出样式的场景。
内容的提问来源于stack exchange,提问作者Chuu
相关产品推荐
相关产品推荐

