2009-06-04 2 views
1

Я выполнял некоторую работу над незнакомой базой кода, которая использует UChar * как строки. Uchars определяются следующим образом (по крайней мере, в соответствии с БГД)Как напечатать UChar * var как строку из gdb?

(gdb) ptype UChar 
type = short unsigned int 

Однако, когда я пытаюсь напечатать их в БГД, я просто получить адрес. Я также могу индексировать указатель и извлекать значения каждого символа.

Есть ли способ распечатать переменную типа UChar * изнутри gdb и вернуть значимую строку?

Также, это на OS X, если это имеет значение.

ответ

0

Сначала вам нужно выяснить, что представляет собой UChar. Скорее всего, UTF-16 или UCS-2 (но BE или LE?). Как только вы это определите, вы хотите предоставить (вы, вероятно, можете использовать существующий код, такой как iconv) метод отладки для преобразования в UTF-8. См. http://www.skynet.ie/~caolan/TechTexts/GdbUnicodePrinting.html.

+0

Обратите внимание, что текущие версии CVS GDB интегрируют libiconv, поэтому внешние хаки, подобные описанным выше, больше не нужны. –

+0

Занятый русский, позаботьтесь о деталях в качестве ответа? Я этого раньше не видел. Хотя я не знаю, как новый OS X gdb. –

-2

если это строка ASCII, вы можете попытаться сказать GDB переосмысливать:

(gdb) print (char*) theUcharPtr 
+2

Возможно, это не сработает, потому что UTF-16 имеет высокий байт null для общих символов (например, ASCII), а C-строки имеют нулевое завершение. –

0

печать такой же, как х; x/1s 0x1234 - распечатает это место в памяти в виде строки, если вы продолжаете наносить удары по рельефу, он напечатает следующую строку ... и т. Д.

Если вы хотите постоянно следить за чем-то, используйте дисплей/с тем же спецификатором формата, что и x (печать). «display/1s 0x1234», а затем каждый раз, когда вы переходите через точку останова или на один шаг, вы увидите информацию, которую вы сконфигурировали. Обновлено и т. д.

3

Просто определите эту команду в своем .gdbinit и введите uc VarName (ЯК, скорее всего, работать в сокращенном виде для команды ucharprint вы определяете)

define ucharprint 
echo " 
set $c = (unsigned short*)$arg0 
while (*$c) 
    if (*$c > 0x7f) 
    printf "[%x]", *$c 
    else 
    printf "%c", *$c 
    end 
    set $c++ 
end 
echo "\n 
end

Вам не нужно беспокоиться о том, так как каждый байтов без знака короткие вашего типа UTF-16 Uchar имеет кодовую точку (или половина суррогата) как внутреннее двоичное целое число.