2010-07-26 14 views
7

Mam wskaźnik w GDB, jak mogę dowiedzieć się, gdzie został on najpierw przydzielony na stercie?W GDB, jak dowiedzieć się, kto malloc'ed adres na kupie?

W WinDBG, można to zrobić przez !heap -p -a <0x12345678> po włączeniu gflags /i <*exe> +ust

Od Valgrind może mi powiedzieć, gdzie pamięć jest alokowana (gdy wykryje jakieś przecieki), myślę, że jest to również możliwe?

(to nie o watchpoint. Jest to biorąc pod uwagę sytuację, w której ja przypadkowo włamać się w GDB, aplikacji, spojrzeć na wskaźnik i chcą wiedzieć „kto stworzył ten kawałek pamięci”?)


Użycie odwrotnego debugowania w GDB to bardzo nowatorski sposób i prawdopodobnie poprawny sposób na rozwiązanie tego problemu. Napotkałem pewien problem z tym podejściem z GDB 7.1 - najnowszą stabilną wersją. Odwrotne debugowanie jest dość nową funkcją w GDB, więc musiałem sprawdzić HEAD (7.2), aby to naprawić.

To prawdopodobnie mówi coś o dojrzałości podejścia GDB, ale myślę, że zdecydowanie powinno być stosowane, gdy jest bardziej dojrzałe. (Niesamowita funkcja!)

Odpowiedz

3

Valgrind przejmuje kontrolę nad zarządzaniem pamięcią, tak działają kontrolery sterty. W samym GDB nie ma obiektu, który wskazywałby, gdzie podany adres został zwrócony przez malloc(3). Proponuję przejrzeć mtrace i glibc allocation debugging.

+0

Dzięki! Zarówno twoje podejście, jak i ks1322 wydają się prawidłowe. Wnikliwe jest poznanie debugowania alokacji mtrace i glib. Z drugiej strony uważam, że podejście ks1332 jest bardziej sprytne i prawdopodobnie bliższe GDB (stąd tytuł pytania). Będę eksperymentował z obydwoma i zobaczę, który z nich jest lepszy w praktyce, zanim wybierze poprawną odpowiedź. – kizzx2

6

Może pomoże tutaj reverse debugging. Spróbuj ustawić punkt obserwacyjny na adres pamięci i odwrotnie - kontynuuj, aż pamięć zostanie zapisana.

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

Dzięki! Zarówno twoje podejście, jak i Nikolai wydają się ważne. Twoje podejście jest bardziej sprytne i prawdopodobnie bliższe GDB (stąd tytuł pytania). Z drugiej strony jest wnikliwe, aby wiedzieć o debugowaniu przydziału mtrace i glib. Będę eksperymentował z obydwoma i zobaczę, który z nich jest lepszy w praktyce, zanim wybierze poprawną odpowiedź. – kizzx2

+0

Tak, to jest zabawne, ale nie sądzę, że jest to praktyczne, poza bardzo małymi programami (nigdy nawet wielowątkowym). –

+0

@Nikolai: to chyba prawda. Odwracanie debugowania jest naprawdę ekscytujące z technicznego punktu widzenia, ale w wielu przypadkach prawdopodobnie nie jest wystarczająco dojrzałe. Jednym z showstopperów jest to, że 'record' nie * nie * uruchomi się w programie Hello World, ponieważ odmawia rejestracji jakiegokolwiek IO (TTY, systemu plików itp.). Już samo to sprawia, że ​​korzystanie z niej w każdej prawdziwej sytuacji jest niepraktyczne. Nie jestem pewien, czy to zamierzone zachowanie. – kizzx2

2

rekord DZIAŁA w programie Hello World. Heck Używam rekordu do debugowania samego GDB!

+0

Dzięki za przypomnienie! Byłem oczywiście nieświadomy, kiedy próbowałem - powiedział "operacja nieobsługiwana lub coś". Myślę, że może to być związane z 32-bitowymi 64-bitowymi problemami. Spróbowałem ponownie w 32-bitowym Ubuntu i działało jak czar! Jakieś wskazówki, dlaczego może nie działać na Arch x86_64? (Podejrzewam, że może to być związane z 64-bitową wersją glibc czy coś takiego, nie wiem: P) – kizzx2

+0

nagrywanie/powtarzanie czasami wypluwa niektóre ostrzeżenia, ale to niekoniecznie oznacza, że ​​nie działa. Powinien także działać dla x86_64, ale obsługa i386 jest bardziej dojrzała. –

+0

Zajrzałem do problemu.Ten szczególny problem wynikał z tego, że moja biblioteka libc została skompilowana w taki sposób, aby zawierała pewne instrukcje MMX, których GDB 7.1 nie obsługiwał. Sprawdziłem HEAD (7.2 w momencie pisania) i zadziałało. – kizzx2

Powiązane problemy