2013-04-19 1 views
7

버그가있는 (메모리 누수) 소프트웨어가 있습니다. 증거로서, 1GB의 core.dump 파일이 있습니다. 힙 크기는 900MB이므로 분명히 어떤 것이 할당되지만 메모리를 확보하지는 않습니다.gdb, 메모리 덤프, 형식화 된 출력을 파일로 저장

그래서 저는 이렇게 검사 할 메모리 영역이 있습니다.

(gdb) x/50000s 0x200000000 

그러나 이것은 단지 객체 나 구조체가 해제되지 않습니다 육안으로 추측하기 어렵다. 추적 할 생각은 "gdb 형식의 출력을 파일로 저장하고 패턴 매치를 실행하여 어떤 마법 문자열이 가장 많이 나오는 지 확인하십시오." 그럼, 여기 내 질문 :

나는 분석기를 쓸 수 있도록 텍스트 파일에 다음 명령의 출력을 저장할 수 있습니까?

(gdb) x/10000000s 0x20000000 <-- I need this output into a file 

감사합니다.

답변

7

다음 명령의 출력을 텍스트 파일에 저장하여 분석기에 쓸 수있는 방법은 무엇입니까? 아주 쉽게 사실이다

(gdb) x/10000000s 0x20000000 

:

(gdb) set height 0 # prevent GDB from stopping every screenfull 
(gdb) set logging on # GDB output is now also copied into gdb.txt 
(gdb) x/10000000s 0x20000000 
(gdb) quit 

짜잔, gdb.txt에 출력을 즐길 수 있습니다.

나는 버그가있는 (메모리 누수) 소프트웨어가 있습니다. ... "gdb 형식의 출력을 파일로 저장하고 패턴 일치를 실행하여 어떤 마법 문자열이 가장 많이 나오는 지 확인하십시오."

그 아이디어는 만족할만한 결과를 얻지 못할 것입니다. 다음을 고려하십시오 :

void some_function() { 
    std::vector<string> *v = new std::vector<string>(); 
    // code to insert and use 1000s of strings into "v". 
    return; // Oops: forgot to delete "v". 
} 

실제로 "가장 많이 나오는 마법의 문자열"을 볼 수 있다고해도 모든 문자열을 누출하고 있음을 알 수 있습니다. 그러나 그들은 이 아니며 문제가 "누출"하는 것이 문제입니다.

정말 원하는 것은 할당 된 영역이 다른 할당 된 영역을 가리키고 그 그래프의 "루트"를 찾는 그래프를 만드는 것입니다. 손으로하는 것은 거의 불가능합니다.

그래서 은 무엇입니까은 (는) 메모리 누수를 찾는 데 도움이 될 가능성이 높습니다.

  • ... 등 등

    • Valgrind
    • 구글 힙 checker 누출,
    • jemalloc, 다행히를 위해이 문제를 해결할 수 많은 도구이있다
  • +0

    쓰기 로그 에 표시됩니다 것을 할 것입니다. 참고 : https://sourceware.org/gdb/onlinedocs/gdb/Dump_002fRestore-Files.html – Alex

    16

    당신은 GDB의 "덤프"기능을 사용할 수 있습니다, 참조 : https://sourceware.org/gdb/onlinedocs/gdb/Dump_002fRestore-Files.html

    당신의 예를 들면 다음과 같습니다

    dump binary memory result.bin 0x200000000 0x20000c350 
    

    이 당신에게 일반 이진 덤프 INT 파일 result.bin을 줄 것이다. 또한 진수 형식으로 덤프를 사용할 수 있습니다 :

    dump ihex memory result.bin 0x200000000 0x20000c350 
    

    덤프 명령 (심지어 어떻게 든 나를 위해 작동하지 않았다) gdb를 로깅 해킹을 사용하는 것보다 훨씬 명확 사용.

    0

    당신이 쓸 수있는 간단한 LKM은

    lkm: 
    #include <linux/kernel.h> 
    #include <linux/module.h> 
    
    int *ptr=(int*)0Xc18251c0; //the address you want to read from kernel space 
    int module_i(void) 
    { 
    printk("%d\n",*ptr); 
    } 
    module_init(module_i); 
    

    하고 데이터가 너무 전용 덤프 명령은 GDB도 있습니다

    enter code here 
    dmesg 
    
    +0

    /dev/kmem 또는/proc/kcore를 사용하면됩니다. 더구나,이 질문에 대답하지 않습니다. – minmaxavg

    관련 문제