Manuelles setzen von breakpoints in WinDBG
Ich versuche zu prüfen, die Montage für eine ausführbare Datei mit WinDBG, aber ich habe eine harte Zeit zu bekommen, um es. Ich will setzen Sie einen Haltepunkt bei der ersten Anweisung in meinem Programm, aber wenn ich versuche zu tun, die manuell (mit der Adresse des Moduls), WinDBG sagt mir, dass es "unable to insert breakpoint" an dieser Stelle durch ein "Ungültiger Zugriff auf Speicherbereich."
Ich merke, dass wenn ich einen breakpoint durch die source-code-GUI, die Adresse ist nicht die gleiche wie der erste Teil meines Moduls (In meinem Beispiel: "Win32FileOpen", ein einfaches Programm, das ich schrieb.) Gibt es einen header von einer Art, erfordert das hinzufügen von offset zu der Adresse von meinem Modul?
In einem anderen Frage, sah ich den Vorschlag: "ich würde versuchen, berechnen Sie die breakpoint-Adresse: Modul start - + - code start + code offset", aber war sich nicht sicher, wo zu erhalten, diese Werte. Kann bitte jemand etwas näher erläutern?
Der Grund, warum ich nicht einfach den source-GUI ist, dass ich möchte in der Lage sein, dies zu tun mit einem Programm, kann ich nicht die Quelle/Symbole für.
Wenn es eine einfachere Möglichkeit gibt, um sofort zu arbeiten beginnen, mit der ausführbaren Datei, die ich öffne, lassen Sie es mich bitte wissen. (z.B. Öffnen eines .exe-Olly sofort zeigt mir die Montage .exe-Datei, die auf der Suche nach referenzierten strings gibt mir Ergebnisse aus diesem Modul, etc. WinDBG scheint zu beginnen me off in ntdll.dll,, das ist in der Regel nicht nützlich für mich.)
0:000> lm
start end module name
00000000`00130000 00000000`0014b000 Win32FileOpen C (private pdb symbols) C:\cfinley\code\Win32FileOpen\Debug\Win32FileOpen.pdb
00000000`73bd0000 00000000`73c2c000 wow64win (deferred)
00000000`73c30000 00000000`73c6f000 wow64 (deferred)
00000000`74fe0000 00000000`74fe8000 wow64cpu (deferred)
00000000`77750000 00000000`778f9000 ntdll (pdb symbols) c:\symbols\mssymbols\ntdll.pdb\15EB43E23B12409C84E3CC7635BAF5A32\ntdll.pdb
00000000`77930000 00000000`77ab0000 ntdll32 (deferred)
0:000> bu 00000000`00130000
0:000> bl
0 e x86 00000000`001413a0 0001 (0001) 0:**** Win32FileOpen!main <-- One that is generated via GUI
1 e x86 00000000`00130000 0001 (0001) 0:**** Win32FileOpen!__ImageBase <-- One I tried to set manually
0:000> g
Unable to insert breakpoint 1 at 00000000`00130000, Win32 error 0n998
"Invalid access to memory location."
bp1 at 00000000`00130000 failed
WaitForEvent failed
ntdll!LdrpDoDebuggerBreak+0x31:
00000000`777fcb61 eb00 jmp ntdll!LdrpDoDebuggerBreak+0x33 (00000000`777fcb63)
InformationsquelleAutor Chris Finley | 2012-05-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie in der Lage sein, um eine Liste aller Einstiegspunkte für die dll mit dem folgenden:
aber seien Sie gewarnt, dies alles aufzulisten,
wenn Sie wollte nur Win32FileOpen:
Liste mit allen überein, so Listen Sie die richtigen Adressen, können Sie den Haltepunkt auf.
Ihre andere Frage über offsets, können Sie einen breakpoint auf eine Methode-name oder-Adresse, und fügen Sie einen Versatz:
Wenn Sie öffnen Sie die exectuable es wird debugbreak sofort und wahrscheinlich nicht starten Sie das laden der dlls, wenn dies ein Problem ist, dann können Sie ungelöste Haltepunkte:
oder einfach nur befestigen, wenn die app startet, Liste der Zeichenfolgen und dann legen Sie die Haltepunkte.
Sie können auch überlegen, ob das setzen von breakpoints auf Quellcode-Zeile:
wo XXX ist die Nummer der Zeile, Hinweis Sie müssen Grab Akzente zu demark die Quellcode-Zeile, hoffe das hilft.
Bearbeiten
Nur diesen link gefunden, die möglicherweise von Interesse für Sie: http://mattoh.wordpress.com/2010/08/06/setting-breakpoint-on-entry-poin-with-windbg/
auch einer der Kommentatoren verwies auf eine von den pseudo-Register, das ermöglicht Ihnen, die bp auf den Eintrag für Ihr exe:
oder
Sie befestigen konnte, nach dem laden Ihre app, such dann dein Modul für die Einreise Punkte wie schlage ich vor, mit `x myDLL!*' sollte alles aufzulisten, könnten Sie den Haltepunkt in der DllMain Methode, wenn es eingefügt wurde, eine andere Möglichkeit ist die Verwendung von dependency walker-Liste den Eintrag Punkte, die Liste in der Reihenfolge der Adresse
Ja, wenn ich 'x /A Win32FileOpen!*', Ich sehe "000e13a0 Win32FileOpen!main () 000e1000 Win32FileOpen!_enc$textbss$Ende = <keine Typ-information> 000d1000 Win32FileOpen!_enc$textbss$begin = <keine Typ-information>", und man kann extrapolieren, dass ich zu Beginn in main (). Jedoch, wie ich bereits in der Frage, ich muss in der Lage sein, dies zu tun, wenn ich nicht die Symbole.
so hat
bu Win32FileOpen!main
nicht funktionieren oder haben Sie noch immer müssen Sie das Modul starten-Adresse?Win32FileOpen!main
funktioniert in diesem speziellen Fall (weil ich die Symbole), aber wenn ich nicht, dies würde nicht funktionieren, weil es eine "main" - symbol, richtig?InformationsquelleAutor EdChum