2009-06-04 4 views
1

저는 UChar *를 문자열로 사용하는 익숙하지 않은 코드베이스에서 작업을 해왔습니다. 다음과 같이 Uchars 내가 GDB에서 다음을 인쇄 할 때, 난 그냥 주소를 얻을UChar * var를 gdb 내부의 문자열로 어떻게 인쇄합니까?

(gdb) ptype UChar 
type = short unsigned int 

그러나 (적어도 GDB)에 따라 정의된다. 포인터로 색인을 만들고 각 문자의 값을 검색 할 수도 있습니다.

gdb에서 UChar * 유형의 변수를 인쇄하고 의미있는 문자열을 가져 오는 방법이 있습니까?

또한 차이점이있는 경우 OS X에서도 마찬가지입니다.

답변

0

먼저 UChar이 실제로 무엇을 나타내는 지 알아 내야합니다. UTF-16 또는 UCS-2 (BE 또는 LE?) 일 가능성이 큽니다. 이것을 결정한 후에는 iconv과 같은 기존 코드를 사용하여 디버그 방법을 제공하여 UTF-8로 변환하려고합니다. 자세한 내용은 http://www.skynet.ie/~caolan/TechTexts/GdbUnicodePrinting.html을 참조하십시오. 이 ASCII 문자열 인 경우

+0

현재 CVS 버전의 GDB에는 libiconv가 통합되어 있으므로 위와 같은 외부 해킹이 더 이상 필요하지 않습니다. –

+0

러시아어를 구사하는 직원이 답변을 자세히 기재하십시오. 나는 전에 그것을 보지 못했다. 비록 내가 OS X gdb가 얼마나 새로운 것인지 모르겠다. –

-2

, 당신은 재 해석 GDB에게 시도 할 수 있습니다 :

(gdb) print (char*) theUcharPtr 
+2

UTF-16은 일반 문자 (예 : ASCII)에 대해 높은 바이트 널을 갖고 C 문자열이 널로 끝나기 때문에 아마 작동하지 않습니다. –

0

인쇄가 X와 동일하다; x/1s 0x1234 - 캐롤 리턴을 계속 치면 그 위치가 문자열로 메모리에 인쇄됩니다. 다음 행이 출력됩니다 ...

지속적으로 모니터하고 싶다면, display /를 x (인쇄)와 동일한 형식 지정자와 함께 사용하십시오. "display/1s 0x1234"를 입력하면 중단 점이나 한 단계 씩 중단 될 때마다 구성한 정보가 출력됩니다. 업데이트 됨 ...

3

.gdbinit에서이 명령을 정의하고 uc varname에

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 유형의 각 부호 없음 short 이후 엔디 언에 대해 걱정할 필요가 없습니다 (UC 가능성이 사용자가 정의하는 ucharprint 명령에 대한 짧은 형태로 작동합니다) (또는 half surrogate)를 네이티브 이진 정수로 사용합니다.

관련 문제