다음과 같은 것을 가정합니다.
#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.
find 메서드를 사용하면 더 나은 결과를 얻을 수 없습니다.
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
이를 수행하는 방법이 있습니까?
답변
적어도 소스가 최적화 된 경우에는 그렇지 않다고 생각합니다. 그러나 STL 컨테이너를 검사 할 수있는 gdb 용 매크로가 있습니다.
http://sourceware.org/ml/gdb/2008-02/msg00064.html
근데 이거 안쓰니까 YMMV
답변
이 질문에 대한 기존 답변은 매우 오래되었습니다. 최신 GCC 및 GDB 에서는 GDB 7.x에 내장 된 Python 지원 및 GCC와 함께 제공되는 libstdc ++ pretty 프린터 덕분에 Just Works TM 를 사용할 수 있습니다.
OP의 예에서는 다음을 얻습니다.
(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}
자동으로 작동하지 않으면 GDB 위키 의 STL 지원 페이지 에서 첫 번째 글 머리 기호를 참조하십시오 .
자신의 유형에 맞는 Python 예쁜 프린터를 작성할 수도 있습니다. GDB 매뉴얼의 Pretty Printing 을 참조하십시오 .
답변
항상 명백한 것이 있습니다. 자신의 테스트 기능을 정의하십시오 … 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
답변
De-Referencing STL Containers : on this page : http://www.yolinux.com/TUTORIALS/GDB-Commands.html
답변
위의 답변은 작동하고 괜찮습니다. stl-views.gdb를 사용하는 경우 여기에 포함 된 맵과 요소를 보는 적절한 방법이 있습니다. 지도는 다음과 같습니다.
std::map<char, int> myMap;
(gdb) pmap myMap char int
즉 pmap <variable_name> <left_element_type> <right_element_type>
,지도의 요소를 볼 수 있습니다.
도움이되기를 바랍니다.
답변
두 번째 문제 ( Cannot evaluate function -- may be inlined
)는 프로그램을 컴파일 할 때 컴파일러가 DWARF-2 (또는 3 또는 4) 디버깅 정보를 사용하는지 확인하여 해결할 수 있습니다 . DWARF-2에는 인라인 정보가 포함되어 있으므로 설명한 방법 중 하나를 사용하여 std::map
컨테이너의 요소에 액세스 할 수 있어야합니다 .
DWARF-2 디버그 정보로 컴파일하려면 컴파일 -gdwarf-2
명령어에 플래그를 추가 하세요.