문제

a의 내용을 조사하고 싶습니다 std::vector GDB에서 어떻게해야합니까? 그것이 a라고 가정 해 봅시다 std::vector<int> 단순화를 위해.

도움이 되었습니까?

해결책

벡터 std :: 벡터 마이 벡터 내용을 보려면 GDB를 입력하십시오.

(gdb) print myVector

이것은 다음과 유사한 출력을 생성합니다.

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

위에서 달성하려면 GDB 7 (GDB 7.01에서 테스트)과 일부 파이썬 예쁜 프린터가 있어야합니다. 이들의 설치 프로세스에 설명되어 있습니다 GDB 위키.

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

다른 팁

GCC 4.1.2로 std :: 벡터 전체를 인쇄합니다.u003Cint> MyVector라고 불리는 다음을 수행하십시오.

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

디버깅하는 동안 'STL 컨테이너 시청은 다소 문제입니다. 여기에 내가 과거에 사용한 세 가지 다른 솔루션이 있습니다. 그 중 어느 것도 완벽하지 않습니다.

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

2) Visual Studio 2005는 STL 컨테이너 시청에 환상적인 지원을 제공합니다. 이것은 중첩 컨테이너에 대해 작동하지만 STL에 대한 구현을위한 것이며 STL 컨테이너를 부스트 컨테이너에 넣는 경우에는 작동하지 않습니다.

3) 디버깅 중에 인쇄하려는 특정 항목에 대해 자신의 '인쇄'기능 (또는 메소드)을 작성하고 GDB에서 '호출'을 사용하여 항목을 인쇄합니다. 코드 G ++의 어느 곳에서나 인쇄 함수가 호출되지 않으면 GDB에서 '인쇄'기능을 찾을 수 없습니다 (함수가 인쇄된다는 메시지가 표시됩니다). 따라서 -fkeep-inline-funtions로 컴파일하십시오

다음을 ~/.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'}}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top