2011-01-05 5 views
0

Hier ist ein einfacher Asm-Code, den ich in VC++ - Projekt eingefügt habe. return_addr ist die Rücksprungadresse des Stack-Frames. Ich habe eine StackWalk-Funktion (nicht von mir geschrieben codeproject.com/KB/threads/StackWalker.aspx), die StackWalk64() verwendet, um die Frames zu extrahieren. Details dazu sind nicht relevant. Unter Verwendung der Rücksprungadresse extrahiere ich ein einzelnes Byte aus dem Code der Funktion in dem Stapel, der gerade untersucht wird.Lesezugriffsverletzung in Assemblercode

__asm{ 
     push eax 
     push ecx 

     mov eax, return_addr 

     mov cl, BYTE PTR [eax - 5] //Problem Statement 
     mov ret_5, cl 

     pop ecx 
     pop eax 
} 

Ich betreibe meinen Code zusammen mit anderen Anwendungen wie gtalk, vlc usw. Die Anwendung immer stürzt ab, wenn ich das Problem Statement enthalten. Wenn ich diese Anweisungen entferne, funktioniert alles gut. Ich habe einen Debugger ausgeführt und es bricht bei der Problem-Anweisung, die einen 0xzzzzzz-Fehler beim Lesen der Zugriffsverletzung anzeigt. Ich nehme an, dass die Anwendung versucht, den Code einiger eingeschränkter DLL- oder Codeabschnitte zu lesen, und das einen Fehler verursacht. Ich habe einen Versuch Catch Block, aber das hat nicht geholfen. Irgendwelche Vorschläge, was ich tun kann?

+0

Können Sie klären, was mit "Rücksprungadresse des Stapelrahmens" gemeint ist? Es scheint wahrscheinlich, dass dies das Kernproblem ist, das Sie haben. –

+0

0xzzzzzz? Wie wäre es mit der Buchung der IST-Adresse? –

+0

@ Jonathan: Jeder Stapelrahmen hat eine Rücksprungadresse, an der das Steuerelement übertragen wird, sobald die Funktion beendet ist. Es befindet sich in der Anruferfunktion. – Bruce

Antwort

0

Es ist klar, dass der Wert return_addr Wert ist, zeigt es nicht auf einen gültigen Speicherort, da andernfalls die Zugriffsverletzung nicht auftreten würde. Die Details dazu sind sehr relevant.

+0

Die Rückgabeadress enthält einen gültigen Wert. Ich protokolliere alle Daten und in der Log-Datei bekomme ich gültige Werte von ret_5, aber für einige Werte von return_addr (siehe oben) stürzt das Programm ab. Die Basisadresse des Googletalk-Moduls ist 0x400000. Diese Adressen sehen also etwas verdächtig aus. – Bruce