Windows所提供的获取当前调用栈机制和Solaris有点类似,附件代码把它加以封装,以CallStack类提供给
使用者。
使用示例:
注意:在Visiual Project下的工程一定要用debug模式编译。
详细请参照:
http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio
callstack.zip
在Linux下如何在程序中获得当前调用栈信息
在Solaris下如何在程序中获得当前调用栈信息
在AIX下如何在程序中获得当前调用栈信息
《返璞归真--UNIX技术内幕》
使用者。
- #ifndef _CALLSTACK_H_
- #define _CALLSTACK_H_
-
- #include list>
-
- #define MAX_CALLSTACK_FRAMES 102400
-
- class CallStack
- {
- public:
- static bool LoadDbgHelpLib (); //加载所使用的库dbghelp.dll,必须在初始化是调用。
- int GetCallStack(); //获得当前调用栈所有指令地址PC
-
- //把在GetCallStack函数中所获得的所有指令地址转换成函数名和文件名、行号等信息,并打印出来
- int GenCallStackDetails();
-
- private:
- static char *BuildSymbolSearchpath();
- static HANDLE m_process;
- HANDLE m_thread;
- std::listDWORD64> m_framePC;
- };
- #endif
使用示例:
- #include "CallStack.h"
- int main(int argc, char *argv[])
- {
- if(!CallStack::LoadDbgHelpLi())
- {
- printf("Load dbghelp.dll failed!\n");
- return -1;
- }
- CallStack *pStack = new CallStack();
- pStack->GetCallStack();
- pStack->GenCallStackDetails();
- delete pStack;
- return 0;
- }
-
- 结果是:
- Call Stack:
- f:\vs70builds\3077\vc\crtbld\crt\src\dbgdel.cpp (54): operator delete
- f:\vs70builds\3077\vc\crtbld\crt\src\delete2.cpp (21): operator delete[]
- e:\mydocuments\visual studio projects\allochook\allochook.cpp (46): main
- f:\vs70builds\3077\vc\crtbld\crt\src\crt0.c (259): mainCRTStartup
注意:在Visiual Project下的工程一定要用debug模式编译。
详细请参照:
http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio
callstack.zip
在Linux下如何在程序中获得当前调用栈信息
在Solaris下如何在程序中获得当前调用栈信息
在AIX下如何在程序中获得当前调用栈信息
《返璞归真--UNIX技术内幕》