programing

gdb에서 긴 문자열의 전체 값을 인쇄하려면 어떻게 해야 합니까?

itsource 2022. 7. 3. 23:40
반응형

gdb에서 긴 문자열의 전체 값을 인쇄하려면 어떻게 해야 합니까?

GDB에서 C 문자열의 전체 길이를 인쇄하고 싶습니다. 기본적으로는 문자열 전체를 인쇄하려면 어떻게 해야 합니까?

set print elements 0

GDB 매뉴얼:

set print elements number-of-elements
어레이 GDB의 요소 수를 제한합니다.GDB가 대규모 어레이를 인쇄하고 있는 경우, GDB는 에 의해 설정된 요소의 수를 인쇄한 후 인쇄를 중지합니다. set print elements명령어를 입력합니다.이 제한은 문자열 표시에도 적용됩니다.GDB가 시작되면 이 제한은 200으로 설정됩니다. 요소 수를 0으로 설정하면 인쇄가 무제한이 됩니다.

프로그램이 정상적인 상태라면call (void)puts(your_string)출력할 수 있습니다.실제로 디버거에서 사용할 수 있는 모든 함수에 동일한 원리가 적용됩니다.

printf명령어는 문자열 전체를 인쇄합니다.

(gdb) printf "%s\n", string

세 번째 옵션인x 명령어에서는 글로벌 설정을 변경하는 대신 특정 명령어에 다른 제한을 설정할 수 있습니다.사용할 수 있는 문자열의 처음 300자를 인쇄하려면x/300s your_string출력은 읽기 어려울 수 있습니다.예를 들어 SQL 쿼리를 인쇄하면 다음과 같은 결과가 됩니다.

(gdb) x/300 mbs stmt.c_str()0x9cd948: "SELECT article.r"...
0x9cd958: "owid FROM arcticl"...
..

완료하기 위해서:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfe\n"

길이를 지정해야 하지만 해당 문자열의 표현을 변경할 수 있습니다.

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

이것은, 그 값으로 디버깅 하는 경우에 편리합니다.

사용.set elements ...항상 최선의 방법은 아닙니다.이 두 가지를 구별하는 것이 있으면 도움이 될 것이다.set string-elements ....

그래서 .gdbinit에서는 다음 함수를 사용합니다.

define pstr
  ptype $arg0._M_dataplus._M_p
  printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
end

define pcstr
  ptype $arg0
  printf "[%d] = %s\n", strlen($arg0), $arg0
end

경고:

  • 첫 번째는 std::string 멤버에 액세스하기 때문에 c++lib에 의존하지만 쉽게 조정할 수 있습니다.
  • 두 번째는 strlen을 호출하기 때문에 실행 중인 프로그램에서만 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/233328/how-do-i-print-the-full-value-of-a-long-string-in-gdb

반응형