2010-07-26 6 views
7

Ich habe einen Zeiger in GDB, wie kann ich herausfinden, wo es zuerst auf dem Heap zugeordnet wurde? Wie kann man in GDB herausfinden, wer eine Adresse auf dem Heap malloc hat?

In WinDBG, kann dies nach dem Einschalten

Da Valgrind auf gflags /i <*exe> +ust von !heap -p -a <0x12345678> getan werden kann mir sagen, wo der Speicher zugewiesen wird (wenn es einige Lecks erkennt), ich denke, dies auch möglich ist?

(dies ist nicht etwa Beobachtungspunkt ist. Dadurch wird die Situation gegeben, wo ich in GDB brechen zufällig die in die Anwendung, Blick auf einen Zeiger und wollen wissen, „wer dieses Stück Erinnerung geschaffen“?)


Verwendung von Reverse-Debugging in GDB ist eine sehr neuartige Möglichkeit und wahrscheinlich die richtige Weg, um dieses Problem zu lösen. Ich habe mit GDB 7.1 - der neuesten stabilen Version - einige Probleme mit diesem Ansatz festgestellt. Das Reverse Debugging ist ein ziemlich neues Feature in GDB, daher musste ich HEAD (7.2) ausprobieren, um es zu reparieren.

Es sagt wahrscheinlich etwas über die Reife des GDB-Ansatzes aus, aber ich denke, es sollte definitiv verwendet werden, wenn es ausgereifter ist. (Awesome Feature!)

Antwort

3

Valgrind Hijacks Speicherverwaltung Aufrufe, so funktioniert Heap Checker. Es gibt in GDB selbst keine Möglichkeit, Ihnen zu sagen, wo die angegebene Adresse von malloc(3) zurückgegeben wurde. Ich schlage vor, in mtrace und glibc allocation debugging zu suchen.

+0

Danke! Sowohl Ihr Ansatz als auch Ihre ks1322 scheinen gültig zu sein. Es ist aufschlussreich über mtrace und glib allocation debugging zu wissen. Auf der anderen Seite finde ich, dass ks1332s Ansatz schlauer und wahrscheinlich näher an GDB ist (daher der Titel der Frage). Ich werde mit beiden experimentieren und sehen, welche in der Praxis besser ist, bevor ich eine richtige Antwort wähle. – kizzx2

6

Vielleicht reverse debugging wird hier helfen. Versuchen Sie, den Watchpoint auf die Speicheradresse zu setzen und umgekehrt fortzusetzen, bis der Speicher geschrieben ist.

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

Danke! Sowohl Ihre Herangehensweise als auch Nikolais scheinen gültig zu sein. Deine Herangehensweise ist schlauer und wahrscheinlich näher an GDB (daher der Fragetitel). Auf der anderen Seite ist es aufschlussreich über mtrace und glib Allokation Debugging zu wissen. Ich werde mit beiden experimentieren und sehen, welche in der Praxis besser ist, bevor ich eine richtige Antwort wähle. – kizzx2

+0

Ja, das macht Spaß, aber ich denke nicht, dass es praktisch ist, außer für sehr kleine Programme (niemals einmal Multithreading). –

+0

@Nikolai: Es scheint zu stimmen. Während das Reverse-Debugging aus technischer Sicht sehr spannend ist, ist es in vielen Fällen wahrscheinlich nicht ausgereift genug. Ein Showstopper ist das "Record", das es * nicht * in einem Hello World-Programm ausführen wird, weil es keine IO (TTY, Dateisystem usw.) aufzeichnen will. Das allein macht es unpraktisch, in jeder realen Situation zu verwenden. Ich bin mir nicht sicher, ob das das beabsichtigte Verhalten ist. – kizzx2

2

Aufzeichnung läuft auf einem Hello World-Programm. Heck ich benutze Datensatz, um gdb selbst zu debuggen!

+0

Danke für die Erinnerung! Ich war offensichtlich ignorant, als ich es versuchte - es hieß "Operation nicht unterstützt oder etwas". Ich denke es könnte mit 32bit 64bit Problemen zusammenhängen. Ich habe es nochmal mit einem rein 32 Bit Ubuntu versucht und es funktionierte wie ein Zauber! Irgendwelche Hinweise, warum es bei Arch x86_64 nicht funktioniert? (Ich vermute, es könnte mit 64-Bit-Version von glibc oder etwas in Verbindung stehen, weiß ich nicht: P) – kizzx2

+0

Aufnahme/Wiedergabe manchmal spuckt einige Warnungen aus, aber das bedeutet nicht unbedingt, dass es nicht funktioniert. Es sollte auch für x86_64 funktionieren, aber die i386-Unterstützung ist ausgereifter. –

+0

Ich schaute in das Problem.Dieses spezielle Problem war, weil meine libc kompiliert wurde, um einige MMX Anweisungen zu enthalten, die GDB 7.1 nicht unterstützte. Ich habe HEAD (7.2 zum Zeitpunkt des Schreibens) überprüft und es hat funktioniert. – kizzx2

Verwandte Themen