std::vector
GDB 의 내용을 확인하고 싶습니다. 어떻게해야합니까? std::vector<int>
단순성을위한 것이라고 가정 해 봅시다 .
std::vector
GDB 의 내용을 확인하고 싶습니다. 어떻게해야합니까? std::vector<int>
단순성을위한 것이라고 가정 해 봅시다 .
답변:
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에서 잘 작동합니다 .
$HOME/.gdbinit
이 필요 하다는 인상을 받았습니다 . 현재 나는 그런 파일이 전혀 없으며 gdb
의 내용을 올바르게 보여줍니다 std::vector
. 그러나 "램 블링"시도 중에 방금 설치 한 다음 unistalled cgdb
했고 이미 libstdc++5
설치 했기 때문에 왜 예쁜 인쇄가 작동하지 않는지 알 수 없습니다.
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
Cannot evaluate function -- may be inlined
_M_impl
GDB 7.0 이상에서 컴파일러 의 특수 이름 등 을 찾으려면print /r myVector
디버깅하는 동안 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로 컴파일하십시오.
~ / .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'}}