記錄下callstack資訊

2021-05-28 01:45:13 字數 3332 閱讀 3846

本人曾做過自動測試記憶體洩露的程式。記錄記憶體洩露位置時用__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會議後現在開始不斷修改...