gdb로 표준 컨테이너 (std :: map) 내용 검사 0; } gdb에서 프로그램을 실행하는 맵의

다음과 같은 것을 가정합니다.

#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명령어에 플래그를 추가 하세요.