2010-07-26 4 views
7

GDB에 포인터가 있는데, 힙에 처음 할당 된 위치를 어떻게 알 수 있습니까?GDB에서 malloc을 사용하여 힙에 누가 주소를 찾았습니까?

를 WinDBG에서

,이 메모리가 할당된다 (이것은 약간의 누수를 감지 할 때), 나는이 가능하다 생각 말해 줄 수 Valgrind의 때문에 gflags /i <*exe> +ust

켠 후 !heap -p -a <0x12345678>하여 수행 할 수 있습니다?

(이 감시 점에 대해. 이것은 내가 무작위로 포인터를보고 "메모리의이 작품을 만든 사람"알고 싶어, GDB, 응용 프로그램에서 침입 상황을 부여되지 않습니다?)


GDB에서 역 디버깅을 사용하는 것은 매우 새로운 방법이고 아마도 올바른 방법으로이 문제를 해결할 수 있습니다. GDB 7.1에서 가장 최근의 안정 버전 인이 접근 방식에 몇 가지 문제점이 있습니다. 역 디버깅은 GDB의 다소 새로운 기능이므로 HEAD (7.2)를 수정해야합니다.

GDB 접근 방식의 성숙도에 대해서는 아마 분명하지만 좀 더 성숙해지면 확실히 사용해야한다고 생각합니다. (굉장한 기능!)

답변

3

Valgrind는 메모리 관리 호출을 훔쳐서 힙 체커가 작동하는 방식입니다. 주어진 주소가 malloc(3)에 의해 반환 된 곳을 알려주는 GDB 자체의 기능은 없습니다. mtraceglibc allocation debugging을 살펴 보시기 바랍니다.

+0

감사! 접근 방식과 ks1322가 모두 유효 해 보입니다. mtrace 및 glib 할당 디버깅에 대해 알아두면 도움이됩니다. 다른 한편으로, 나는 ks1332의 접근 방식이 좀 더 영리하고 아마도 GDB에 가까울 것이라고 생각한다 (따라서 질문 제목). 두 가지를 모두 시험해보고 정답을 선택하기 전에 실제로 어느 것이 더 나은지 확인합니다. – kizzx2

6

reverse debugging 여기에 도움이 될 것입니다. 메모리 주소에 watchpoint를 설정하고 역순으로 메모리를 쓸 때까지을 계속 실행하십시오.

(gdb) watch *0x12345678 
(gdb) reverse-continue 
+0

감사합니다. 당신의 접근 방식과 니콜라이 모두 유효한 것처럼 보입니다. 당신의 접근 방식은 더 똑똑하고 GDB에 더 가깝습니다 (따라서 질문 제목). 반면에 mtrace 및 glib 할당 디버깅에 대해 알고 있으면 통찰력이 있습니다. 두 가지를 모두 시험해보고 정답을 선택하기 전에 실제로 어느 것이 더 나은지 확인합니다. – kizzx2

+0

그래, 이건 재밌지 만, 아주 작은 프로그램 (멀티 스레딩을 염두에 두지 마라) 이라기보다는 실용적이지 않다고 생각해. –

+0

@ 니콜라이 : 사실 인 것 같습니다. 역 디버깅은 기술적 인면에서 정말로 흥미로운 일이지만 많은 경우에 충분히 성숙하지는 못했을 것입니다. 하나의 showstopper는 IO (TTY, 파일 시스템 등)를 기록하기를 거절하기 때문에 Hello World 프로그램에서'record'가 실행되지 않을 것입니다. 그만큼 실제 생활에서 사용하는 것은 비현실적입니다. 그것이 의도 한 행동인지 확실하지 않습니다. – kizzx2

2

레코드는 Hello World 프로그램에서 실행됩니다. 지옥 나는 gdb 자체를 디버그하기 위해 레코드를 사용합니다!

+0

상기시켜 줘서 고마워! 내가 시도했을 때 나는 분명히 무지했다. 그것은 "작동이 지원되지 않거나 무언가"라고 말했다. 나는 그것이 32 비트 64 비트 문제와 관련이있을 것이라고 생각한다. 나는 순전히 32 비트 우분투에서 다시 시도했고 그것은 매력처럼 작동했다! Arch x86_64에서 작동하지 않는 이유에 대한 지침이 있습니까? (필자는 glibc 또는 64 비트 버전과 관련이있을 것으로 생각합니다. P : – kizzx2

+0

기록/재생이 일부 경고를 울리는 경우가 있지만 반드시 작동하지 않는다는 의미는 아닙니다. x86_64에서도 작동해야하지만, i386 지원은 더 성숙합니다. –

+0

문제를 조사했습니다.이 특별한 문제는 내 libc가 GDB 7.1이 지원하지 않은 MMX 명령어를 포함하도록 컴파일 되었기 때문입니다. 나는 HEAD (글쓰기 당시 7.2)를 체크 아웃했고 작동했다. – kizzx2

관련 문제