請教一下關于StackWalk64的使用,編譯x86工程時,輸出的堆疊是正常的,但是如果編譯x64工程,回圈只進行了一次,是不是我引數傳錯了呢? 請各位大神幫幫忙,給個解決方案。
代碼如下:
#include <Windows.h>
#include "dbghelp.h"
#pragma comment( lib, "dbghelp.lib" )
bool ShowStack()
{
HANDLE h = GetCurrentThread();
CONTEXT Context;
memset(&Context, 0, sizeof(Context));
Context.ContextFlags = (CONTEXT_FULL);
RtlCaptureContext(&Context);
HANDLE hProcess = GetCurrentProcess();
DWORD MachineType;
STACKFRAME64 StackFrame;
ZeroMemory(&StackFrame, sizeof(STACKFRAME64));
#ifdef _M_IX86
MachineType = IMAGE_FILE_MACHINE_I386;
StackFrame.AddrPC.Offset = Context.Eip;
StackFrame.AddrPC.Mode = AddrModeFlat;
StackFrame.AddrFrame.Offset = Context.Ebp;
StackFrame.AddrFrame.Mode = AddrModeFlat;
StackFrame.AddrStack.Offset = Context.Esp;
StackFrame.AddrStack.Mode = AddrModeFlat;
#elif _M_X64
MachineType = IMAGE_FILE_MACHINE_AMD64;
StackFrame.AddrPC.Offset = Context.Rip;
StackFrame.AddrPC.Mode = AddrModeFlat;
StackFrame.AddrFrame.Offset = Context.Rsp;
StackFrame.AddrFrame.Mode = AddrModeFlat;
StackFrame.AddrStack.Offset = Context.Rsp;
StackFrame.AddrStack.Mode = AddrModeFlat;
#elif _M_IA64
MachineType = IMAGE_FILE_MACHINE_IA64;
StackFrame.AddrPC.Offset = Context.StIIP;
StackFrame.AddrPC.Mode = AddrModeFlat;
StackFrame.AddrFrame.Offset = Context.IntSp;
StackFrame.AddrFrame.Mode = AddrModeFlat;
StackFrame.AddrBStore.Offset = Context.RsBSP;
StackFrame.AddrBStore.Mode = AddrModeFlat;
StackFrame.AddrStack.Offset = Context.IntSp;
StackFrame.AddrStack.Mode = AddrModeFlat;
#else
#error "Unsupported platform"
#endif
while (StackWalk64(MachineType, hProcess, GetCurrentThread(), &StackFrame,
&Context, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL))
{
// ...
}
return true;
}
uj5u.com熱心網友回復:
有沒有人搞過這個呢?uj5u.com熱心網友回復:
為什么沒人回答呢?uj5u.com熱心網友回復:
自頂一下,求高手幫幫忙uj5u.com熱心網友回復:
計算機組成原理→DOS命令→匯編語言→C語言(不包括C++)、代碼書寫規范→資料結構、編譯原理、作業系統→計算機網路、資料庫原理、正則運算式→其它語言(包括C++)、架構……對學習編程者的忠告:
多用小腦和手,少用大腦、眼睛和嘴,會更快地學會編程!眼過千遍不如手過一遍!
書看千行不如手敲一行!
手敲千行不如單步一行!
單步源代碼千行不如單步Debug版對應匯編一行!
單步Debug版對應匯編千行不如單步Release版對應匯編一行!
VC除錯時按Alt+8、Alt+7、Alt+6和Alt+5,打開匯編視窗、堆疊視窗、記憶體視窗和暫存器視窗看每句C對應的匯編、單步執行并觀察相應堆疊、記憶體和暫存器變化,這樣過一遍不就啥都明白了嗎。
對VC來說,所謂‘除錯時’就是編譯連接通過以后,按F10或F11鍵單步執行一步以后的時候,或者在某行按F9設了斷點后按F5執行停在該斷點處的時候。
uj5u.com熱心網友回復:
可以參考一下 AfxDumpStack 原始碼uj5u.com熱心網友回復:
看看是不是在呼叫SymFunctionTableAccess64、SymGetModuleBase64之前,沒有呼叫SymInitialize函式。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/130512.html
標籤:基礎類
上一篇:VC類之間呼叫的小問題
