문제

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

#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> 지도에서 요소를 볼 수 있습니다.

도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top