development

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

big-blog 2020. 2. 29. 15:27
반응형

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


GDB에서 C- 문자열의 전체 길이를 인쇄하고 싶습니다. 기본적으로 약어로 표시되므로 GDB가 전체 문자열을 인쇄하도록하려면 어떻게합니까?


set print elements 0

GDB 매뉴얼에서 :

set print elements number-of-elements
배열 GDB에서 인쇄 할 요소 수에 제한을 설정하십시오. GDB가 큰 배열을 인쇄하는 경우 set print elements명령에서 설정 한 요소 수를 인쇄 한 후 인쇄를 중지합니다 . 이 제한은 문자열 표시에도 적용됩니다. GDB가 시작되면이 한계는 200으로 설정됩니다. 요소 수 를 0으로 설정 하면 인쇄가 무제한임을 의미합니다 .

프로그램이 정상 상태에있는 한 call (void)puts(your_string)stdout으로 인쇄 할 수도 있습니다 . 실제로 디버거에서 사용할 수있는 모든 기능에 동일한 원칙이 적용됩니다.


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

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

printf명령은 전체 문자열을 인쇄합니다.

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

완료하기 만하면됩니다.

(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



반응형