You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:39:38