如何在GDB中以%02x格式查看SHA256哈希变量的可读值
如何在GDB中以%02x格式查看SHA256哈希变量的可读值
我太懂你这种困惑了——GDB默认会把指针指向的内存当作可打印字符串来解析,但SHA256哈希本身就是一堆非打印的二进制字节,所以才会显示那些乱七八糟的符号。其实GDB自带了和C语言类似的格式化输出能力,完全能实现你程序里%02x那种可读的十六进制格式,下面给你几个实用的方法:
用GDB内置
printf命令(最贴近程序写法)
GDB里的printf和你C代码里的用法几乎一模一样,你可以直接用它来循环打印每个字节的两位十六进制值:# 先初始化循环变量 set $i=0 # 循环打印每个哈希字节 while $i < SHA256_DIGEST_LENGTH printf "%02x", hash[$i++] end # 最后加个换行符 printf "\n"只要你编译程序时加了
-g调试参数,GDB就能直接识别SHA256_DIGEST_LENGTH这个宏,不用手动写32。执行完这些命令,输出的格式就和你程序运行时的结果完全一致了。用
x命令快速查看内存(适合快速扫一眼)
GDB的x(examine)命令专门用来查看内存,你可以指定格式来输出每个字节的十六进制值:x/32bx hash这里的
32是要查看的字节数,b表示按字节为单位,x表示十六进制格式。这个命令会把32个字节的哈希值以十六进制显示出来,不过默认是分多行输出的,如果你想要紧凑的一行,还是用上面的printf循环更合适。自定义GDB命令(适合频繁使用)
如果你经常需要调试哈希相关的代码,可以在GDB里自定义一个专属命令,省得每次都敲循环:define print_sha256 if $argc != 1 help print_sha256 return end set $i=0 while $i < SHA256_DIGEST_LENGTH printf "%02x", $arg0[$i++] end printf "\n" end document print_sha256 Prints a SHA256 hash in hexadecimal format (matches C's %02x) Usage: print_sha256 <hash_pointer> end定义好之后,每次只要输入
print_sha256 hash就能直接得到格式化后的哈希值,非常省心。
最后提醒一句:编译程序的时候一定要加上-g参数生成调试信息,不然GDB可能识别不了SHA256_DIGEST_LENGTH宏,也没法正确解析变量的类型哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

