GDB에서 C ++ 벡터의 요소를 어떻게 인쇄합니까?


210

std::vectorGDB 의 내용을 확인하고 싶습니다. 어떻게해야합니까? std::vector<int>단순성을위한 것이라고 가정 해 봅시다 .


3
비슷한 질문 : stackoverflow.com/questions/427589/… (답변의 링크는 매우 흥미 롭습니다).
Paolo Tedesco 2016 년

이 작업을 수행하는 새로운, 더 좋은 방법은이 질문에 : stackoverflow.com/questions/2492020/...
dshepherd

답변:


79

vector std :: vector myVector 내용을 보려면 GDB를 입력하십시오.

(gdb) print myVector

다음과 유사한 출력이 생성됩니다.

$1 = std::vector of length 3, capacity 4 = {10, 20, 30}

위의 결과를 얻으려면 gdb 7 (gdb 7.01에서 테스트했습니다)과 python pretty-printer가 필요합니다. 이것들의 설치 과정은 gdb wiki에 설명되어 있습니다.

또한 위의 설치 후 Eclipse C ++ 디버거 GUI 및 GDB를 사용하는 다른 모든 IDE에서 잘 작동합니다 .


16
벡터 요소를 직접 해석 할 수있는 한 제대로 작동합니다. 그러나 벡터에 관심 항목에 대한 포인터가 포함되어 있으면 도움이되지 않습니다.
wallyk

솔직히 gdb 위키 페이지가 특히 "구체적으로"구식이기 때문에 읽을 수있는 것을 찾지 못했 습니까? 예를 들어, 제안 된 내용 $HOME/.gdbinit이 필요 하다는 인상을 받았습니다 . 현재 나는 그런 파일이 전혀 없으며 gdb의 내용을 올바르게 보여줍니다 std::vector. 그러나 "램 블링"시도 중에 방금 설치 한 다음 unistalled cgdb했고 이미 libstdc++5설치 했기 때문에 왜 예쁜 인쇄가 작동하지 않는지 알 수 없습니다.
엔리코 마리아 데 안젤리 스

257

GCC 4.1.2에서는 myVector라는 std :: vector <int> 전체를 인쇄하려면 다음을 수행하십시오.

print *(myVector._M_impl._M_start)@myVector.size()

첫 번째 N 요소 만 인쇄하려면 다음을 수행하십시오.

print *(myVector._M_impl._M_start)@N

설명

이것은 아마도 컴파일러 버전에 크게 의존하지만 GCC 4.1.2의 경우 내부 배열에 대한 포인터는 다음과 같습니다.

myVector._M_impl._M_start 

포인터 P에서 시작하는 배열의 N 요소를 인쇄하는 GDB 명령은 다음과 같습니다.

print P@N

또는 짧은 형식으로 (표준 .gdbinit의 경우) :

p P@N

4
Hehe, 그것은 전에 나를 괴롭힌 것이므로 오늘 아침에 그것을 찾아서 나 자신에게 메모로 추가했습니다 (Jeff 자신이 권장 한대로).
존 카터

3
또한 특정 벡터 요소 만 원한다면 myVector._M_impl._M_start + n (n 번째 요소)
Mariner

1
나를 위해 작동하지 않습니다. Cannot evaluate function -- may be inlined
wallyk

1
인쇄 (myVector._M_impl._M_start) [2] : 단일 요소, 예를 들어 2 요소를 인쇄하려면
jfritz42

2
_M_implGDB 7.0 이상에서 컴파일러 의 특수 이름 등 을 찾으려면print /r myVector
Eponymous

14

디버깅하는 동안 STL 컨테이너를 '보고'는 다소 문제가 있습니다. 과거에 사용한 3 가지 솔루션이 있지만 그중 어느 것도 완벽하지는 않습니다.

1) http://clith.com/gdb_stl_utils/의 GDB 스크립트 사용 이 스크립트를 사용하면 거의 모든 STL 컨테이너의 내용을 인쇄 할 수 있습니다. 문제는 세트 스택과 같은 중첩 컨테이너에는 작동하지 않는다는 것입니다.

2) Visual Studio 2005는 STL 컨테이너 시청을 환상적인 지원합니다. 이것은 중첩 컨테이너에서 작동하지만 STL 전용으로 만 구현되며 Boost 컨테이너에 STL 컨테이너를 배치하는 경우 작동하지 않습니다.

3) 디버깅하는 동안 인쇄하려는 특정 항목에 대해 자체 '인쇄'기능 (또는 방법)을 작성하고 GDB에서 '호출'을 사용하여 항목을 인쇄하십시오. 코드에서 인쇄 함수가 호출되지 않으면 g ++은 데드 코드 제거를 수행하고 GDB에서 '인쇄'함수를 찾을 수 없습니다 (함수가 인라인되었다는 메시지가 나타납니다). 따라서 -fkeep-inline-functions로 컴파일하십시오.


11

~ / .gdbinit에 다음을 넣으십시오.

define print_vector
    if $argc == 2
        set $elem = $arg0.size()
        if $arg1 >= $arg0.size()
            printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
            set $elem = $arg1 -1
        end
        print *($arg0._M_impl._M_start + $elem)@1
    else
        print *($arg0._M_impl._M_start)@$arg0.size()
    end
end

document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end

gdb (또는 ~ / .gdbinit 소싱)를 다시 시작한 후 이와 같은 관련 도움말을 표시하십시오.

gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display

사용법 예 :

(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0,     payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}

2
코드 감사합니다! 오타가 있고 "print * ($ arg0._M_impl._M_start + $ elem) @ 1"은 "print * ($ arg0._M_impl._M_start + $ arg1) @ 1"이어야합니까? 다음 수정을 사용합니다. $ argc == 2 인 경우 print_vector 정의 $ arg1> = $ arg0.size ()-1 printf "오류, % s.size () = % d, 마지막 요소 인쇄 : \ n", " $ arg0 ", $ arg0.size ()-1 엔드 프린트 * ($ arg0._M_impl._M_start + $ arg1) @ 1 else print * ($ arg0._M_impl._M_start) @ $ arg0.size () 엔드 엔드
user1541776

엘 마 그니 피코!
mochas

0

파티에 조금 늦었으므로 다음에이 검색을 할 때 주로 나에게 상기시켜줍니다!

나는 사용할 수 있었다 :

p/x *(&vec[2])@4

에서 vec시작하여 4 개의 요소 (16 진수)를 인쇄 vec[2]합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.