GDB로 표준 컨테이너 검사 (std :: map) 내용
문제
다음과 같은 것을 가지고 있다고 가정합니다.
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
GDB에서 프로그램을 실행하는지도의 내용을 검사하고 싶습니다.
첨자 연산자를 사용해 보면 다음을 얻을 수 있습니다.
(gdb) p m[1]
Attempt to take address of value not located in memory.
찾기 방법을 사용하면 더 나은 결과를 얻을 수 없습니다.
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
이것을 달성 할 수있는 방법이 있습니까?
해결책
최소한 소스가 최적화되어 있는지는 없다고 생각합니다. 그러나 GDB를위한 매크로가 STL 컨테이너를 검사 할 수있는 매크로가 있습니다.
http://sourceware.org/ml/gdb/2008-02/msg00064.html
그러나 나는 이것을 사용하지 않으므로 ymmv
다른 팁
이 질문에 대한 기존 답변은 다음과 같습니다 매우 날짜가 없습니다. 최근 GCC와 GDB를 사용하면 작동합니다TM GDB 7.X의 내장 된 파이썬 지원과 GCC와 함께 제공되는 LibStdc ++ Prett Printer 덕분입니다.
OP의 예를 위해서는 다음과 같습니다.
(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}
자동으로 작동하지 않으면 첫 번째 총알 포인트가 STL 지원 GDB 위키의 페이지.
자신의 유형에 대한 Python Pretty Printer도 쓸 수 있습니다. 예쁜 인쇄 GDB 매뉴얼에서.
항상 명백한 것이 있습니다. 자신의 테스트 기능을 정의하십시오 ... GDB에서 전화하십시오. 예 :
#define SHOW(X) cout << # X " = " << (X) << endl
void testPrint( map<int,int> & m, int i )
{
SHOW( m[i] );
SHOW( m.find(i)->first );
}
int
main()
{
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0; // Line 15.
}
그리고:
....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD
Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb)
그만큼 stl-views.gdb
예전에는 최고의 대답 이었지만 더 이상은 아니 었습니다.
이것은 메인 라인에 통합되지 않습니다 GDB
그러나 여기에 'Archer-Tromey-Python'을 사용하는 것이 있습니다. 나뭇가지:
(gdb) list
1 #include <map>
2 int main(){
3 std::map<int,int> m;
4 m[1] = 2;
5 m[2] = 4;
6 return 0;
7 }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run
Breakpoint 1, main () at map.cc:6
6 return 0;
(gdb) print m
$1 = std::map with 2 elements = {
[1] = 2,
[2] = 4
}
(gdb) quit
STL 컨테이너를 중심으로 시도해보십시오 :이 페이지에서 : http://www.yolinux.com/tutorials/gdb-commands.html
두 번째 문제를 해결할 수 있습니다 (Cannot evaluate function -- may be inlined
) 프로그램을 컴파일 할 때 컴파일러가 DWARF-2 (또는 3 또는 4) 정보 디버깅 정보를 사용하는지 확인합니다. DWARF-2에는 정보가 포함되어 있으므로 설명하는 방법 중 하나를 사용할 수 있어야합니다. std::map
컨테이너.
Dwarf-2 디버그 정보를 컴파일하려면 다음을 추가하십시오 -gdwarf-2
컴파일 명령에 플래그.
위의 답변은 작동하고 괜찮습니다. stl-views.gdb를 사용하는 경우 여기 내부의지도와 요소를 보는 올바른 방법이 있습니다. 지도를 다음과 같습니다. std::map<char, int> myMap;
(gdb) pmap myMap char int
즉 pmap <variable_name> <left_element_type> <right_element_type>
지도에서 요소를 볼 수 있습니다.
도움이되기를 바랍니다.