【问题标题】:How do I print a UChar* var as a string from inside of gdb?如何从 gdb 内部将 UChar* var 作为字符串打印?
【发布时间】:2009-06-04 22:53:27
【问题描述】:

我一直在做一些使用 UChar* 作为字符串的不熟悉的代码库的工作。 uchars定义如下(至少根据gdb)

(gdb) ptype UChar
type = short unsigned int

但是,当我尝试在 gdb 中打印这些内容时,我只得到了地址。我还可以索引指针并检索每个字符的值。

有什么方法可以从 gdb 中打印一个 UChar* 类型的变量并返回一个有意义的字符串?

另外,这是在 OS X 上,如果这有什么不同的话。

【问题讨论】:

    标签: gdb printing


    【解决方案1】:

    只需在您的 .gdbinit 中定义此命令并输入 uc varname(uc 可能会作为您定义的 ucharprint 命令的缩写形式)

    定义ucharprint
    回声“
    设置 $c = (unsigned short*)$arg0
    而 ( *$c )
      如果 ( *$c > 0x7f )
        printf "[%x]", *$c
      别的
        printf "%c", *$c
      结尾
      设置 $c++
    结尾
    回声“\n
    结束

    您无需担心字节顺序,因为 UTF-16 UChar 类型中的每个 unsigned short 都将一个代码点(或半代理项)作为本机二进制整数。

    【讨论】:

      【解决方案2】:

      您首先需要弄清楚 UChar 实际代表什么。它可能是 UTF-16 或 UCS-2(但 BE 或 LE?)。一旦确定了这一点,您就需要提供(您可能可以使用现有代码,例如iconv)一个调试方法来转换为 UTF-8。详情请见http://www.skynet.ie/~caolan/TechTexts/GdbUnicodePrinting.html

      【讨论】:

      • 请注意,当前的 CVS 版本的 GDB 集成了 libiconv,因此不再需要像上面这样的外部 hack。
      • 受雇于俄罗斯人,愿意发布详细信息作为答案吗?我以前没见过。虽然我不知道 OS X gdb 有多新。
      【解决方案3】:

      print 和 x 一样; x/1s 0x1234 -- 将内存中的那个位置打印为字符串,如果你一直按carrage return,它将打印下一行......等等......

      如果您想持续监控某些内容,请使用具有与 x(打印)相同的格式说明符的 display/。 "display/1s 0x1234" 那么每次你通过断点或单步中断时,你都会看到你配置的信息打印出来......更新等等......

      【讨论】:

        【解决方案4】:

        如果它是一个 ascii 字符串,你可以尝试告诉 gdb 重新解释:

        (gdb) print (char*) theUcharPtr
        

        【讨论】:

        • 这可能行不通,因为 UTF-16 具有用于常见字符(即 ASCII)的高字节空值,并且 C 字符串以空值结尾。
        猜你喜欢
        • 2013-08-20
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-09
        相关资源
        最近更新 更多