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


376

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

답변:


504
set print elements 0

GDB 매뉴얼에서 :

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

4
요즘에는 "set print repeats 0"이 필요할 수도 있습니다. 그렇지 않으면 GDB는 문자열 / 배열의 반복되는 요소를 생략합니다.
존 린드그렌

이것은 배열 유형에도 적용됩니다
Trevor Boyd Smith

1
"max-value-size 무제한"을 설정해야 할 수도 있습니다.
AMS

100

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


2
이 대답은 줄 바꿈 / 캐리지 리턴 문자를 이스케이프 처리하지 않고 존중하기 때문에 "내 인쇄 목적으로 0 설정"보다 낫습니다.
mhenry1384

6
좋은 해결책이지만 코어 덤프 파일을 분석 할 때 작동하지 않음
Elalfer

화려한 제안 duskwuff, 나는 그것을 복사하고 인쇄되지 않은 출력을 얻기 위해 printf 호출에 붙여 넣기 전에 그것을 읽었기를 바랍니다. : : D
nevelis

4
참고 :이 옵션은 라이브 프로그램을 디버깅하는 경우에만 작동합니다. 코어 파일을 디버깅 할 때는 GDB의 "호출"명령을 사용할 수 없습니다.
Solomon Slow

1
또한 gdb가 제정신이어야하는데, 점점 더 사실이 아닌 것 같습니다 (Mac OS X 컴퓨터에서 "현재 컨텍스트에"기호 "가 없습니다")
Michael

39

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

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

3
"x / 300sb"의 의미가 궁금합니다. 이 치트 시트 (pdf)를 사용하여 "x / 300sb cstr"을 "주소 cstr에서 메모리의 eXamine 300 단위 (바이트)로 변환했으며 NULL로 끝나는 문자열 (S)로 해석되었습니다." 문자열의 길이가 100이면 300 바이트가 모두 인쇄되어 의미가 있든 없든 가비지가 많이 나타납니다. 그럼에도 불구하고 나를 소개 해준 +1 x!
Rob W

39

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

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

2
미안하지만 이것은 사실이 아닙니다
UmNyobe

11
이것은 set print elements nnn제한 을 존중하는 것 같으며 , 그렇지 않으면 전체 문자열을 인쇄하지 않습니다 set print elements 0.
Mark Lakata

3
시도하면 "값을 정수로 변환 할 수 없습니다."
Philipp Ludwig

2
std :: string의 경우 "값을 정수로 변환 할 수 없습니다"오류를 피하기 위해 string.c_str ()이 필요합니다
Paul Childs

21

완료하기 만하면됩니다.

(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}

값으로 디버그하려는 경우 유용 할 수 있습니다.


1

사용하면 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을 호출 할 때 실행중인 프로그램에서만 사용할 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.