本人曾做過自動測試記憶體洩露的程式。記錄記憶體洩露位置時用__file__, 和__line__來記錄位置。
但重要的callstack資訊沒有記錄下來。
無意中看到一篇文章
通過該文,找到了記錄callstack資訊的方法:呼叫下面的api。
bool winapi stackwalk64(
__in dword machinetype,
__in handle hprocess,
__in handle hthread,
__inout lpstackframe64 stackframe,
__inout pvoid contextrecord,
__in_opt pread_process_memory_routine64 readmemoryroutine,
__in_opt pfunction_table_access_routine64 functiontableaccessroutine,
__in_opt pget_module_base_routine64 getmodulebaseroutine,
__in_opt ptranslate_address_routine64 translateaddress
);
而後將原文中的的方法簡單做了修改和封裝。
呼叫方法: vectorcallstack::getcallstack();
#include #include #include #include #define max_address_length 32
#define max_name_length 1024
using namespace std;
struct crashinfo
; // callstack資訊
//
struct callstackinfo
; class callstack
;
#include "stdafx.h"
#include "callstackinfo.h"
// 新增對dbghelp.lib的編譯依賴
//
#pragma comment(lib, "dbghelp.lib")
#pragma once
callstack::callstack(void)
callstack::~callstack(void)
// 安全拷貝字串函式
//
void callstack::safestrcpy(char* szdest, size_t nmaxdestsize, const char* szsrc)
else
}
// 得到程式崩潰資訊
//
crashinfo callstack::getcrashinfo(const exception_record *precord)
vectorcallstack::getcallstack()
else }
// 得到callstack資訊
//
vectorcallstack::getcallstack(const context *pcontext)
if (sf.addrframe.offset == 0)
callstackinfo callstackinfo;
safestrcpy(callstackinfo.methodname, max_name_length, "n/a");
safestrcpy(callstackinfo.filename, max_name_length, "n/a");
safestrcpy(callstackinfo.modulename, max_name_length, "n/a");
safestrcpy(callstackinfo.linenumber, max_name_length, "n/a");
byte symbolbuffer[sizeof(imagehlp_symbol64) + max_name_length];
imagehlp_symbol64 *psymbol = (imagehlp_symbol64*)symbolbuffer;
memset(psymbol, 0, sizeof(imagehlp_symbol64) + max_name_length);
psymbol->sizeofstruct = sizeof(symbolbuffer);
psymbol->maxnamelength = max_name_length;
dword symdisplacement = 0;
bool bgetfilename = false;
// 得到函式名
//
if (symgetsymfromaddr64(hprocess, sf.addrpc.offset, null, psymbol))
imagehlp_line64 lineinfo;
memset(&lineinfo, 0, sizeof(imagehlp_line64));
lineinfo.sizeofstruct = sizeof(imagehlp_line64);
dword dwlinedisplacement;
// 得到檔名和所在的**行
//
if (symgetlinefromaddr64(hprocess, sf.addrpc.offset, &dwlinedisplacement, &lineinfo))
imagehlp_module64 moduleinfo;
memset(&moduleinfo, 0, sizeof(imagehlp_module64));
moduleinfo.sizeofstruct = sizeof(imagehlp_module64);
// 得到模組名
//
if (symgetmoduleinfo64(hprocess, sf.addrpc.offset, &moduleinfo))
if(bgetfilename)
arrcallstackinfo.push_back(callstackinfo);
} symcleanup(hprocess);
return arrcallstackinfo;
}
只是記錄下
一直覺得愉悅工作,是生活的非常重要之組成部分,工作除了能提供物質上的滿足之外,同時也是影響著精神狀態的某些部分。比如成就感。工作形式各異,但不影響我們對精神上某種共識。無論是誰,還是需要這樣乙份工,來豐腴下自己的生活,不管你為的是什麼!物質也好精神也罷,我們只是都想帶著某些目標生活,才能了以慰藉這並...
記錄下Vm 學習
a b not not a b not a and not b not a or b not a ornot b not a and b p指的是not or,如p a,b not a or b p a,b a b not a p a,a and a,b p p a,a p b,b or a,b p...
關於專利,記錄下
專利,還是很重要的,平時寫 其實每個人都在寫 怎麼體現你更好,當然bug少,疑難問題都能解決,說明了能力 專利也是體現能力的一種方面吧 2016年終於開始了職場來的第乙份專利的撰寫,修改,僅以此做個記錄,不知道會不會成功,但是要加以百分之五百的努力 201605.23記 prc會議後現在開始不斷修改...