一种获取过程调用堆栈信息的简单方法
生活随笔
收集整理的這篇文章主要介紹了
一种获取过程调用堆栈信息的简单方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在程序崩潰或出現異常時,通常需要給開發人員提供基本的過程調用的信息,這里給出一個簡單的C++實現。主要思路是:過程調用的開始時,在棧上創建一個類,利用類的構造函數記錄相關信息,在過程調用完畢時會自動調用析構函數,再將記錄信息刪除。
Track.h?1?#ifndef?_TRACK_HPP_?2?#define?_TRACK_HPP_
?3?#include?<vector>
?4?
?5?//!調用堆棧類
?6?class?CallStack
?7?{
?8?public:
?9?????struct?CallInfo
10?????{
11?????????const?char*?func_name;??///<調用函數名
12?????????const?char*?file_name;??///<源程序文件名
13?????????int?????????line_number;///<行編號
14?
15?????????CallInfo(const?char*?func,const?char*?file,int?line)
16?????????????:func_name(func),file_name(file),line_number(line)
17?????????{}
18?????};
19?
20?????//!添加一個調用過程
21?????inline?void?Push(const?char*?func_name,const?char*?file_name,int?line_number)
22?????{
23?????????call_stack.push_back(CallInfo(func_name,file_name,line_number));
24?????}
25?????//!彈出一個調用過程
26?????inline?void?Pop()
27?????{
28?????????call_stack.pop_back();
29?????}
30?????//!獲取當前的調用堆棧信息
31?????inline?const?std::vector<CallInfo>&?GetCallStack()const
32?????{
33?????????return?call_stack;
34?????}
35?
36?????static?CallStack&?GetInstance(){
37?????????static?CallStack?g_stack;
38?????????return?g_stack;
39?????}
40?
41?private:
42?????CallStack():call_stack(){}
43?????std::vector<CallInfo>?call_stack;
44?};
45?#define?g_CallStack?CallStack::GetInstance()
46?
47?//!調用過程跟蹤類
48?class?Track
49?{
50?public:
51?????Track(const?char*?func_name,const?char*?file_name,int?line_number)
52?????{
53?????????g_CallStack.Push(func_name,file_name,line_number);
54?????}
55?????~Track()
56?????{
57?????????g_CallStack.Pop();
58?????}
59?
60?private:
61?????Track();
62?};
63?
64?///使用該宏實現調用信息的記錄
65?#define?TRACK(func)?Track?track(#func,__FILE__,__LINE__);
66?
67?///使用該宏實現僅在調試階段記錄過程調用信息
68?#ifdef?_DEBUG
69?????#define?TRACK_D(func)?TRACK(func)
70?#else
71?????#define?TRACK_D(func)
72?#endif
73?
74?#endif?//_TRACK_HPP_
?
test.cpp#include?"Track.hpp"void?Test2();
void?Test1()
{
????TRACK(Test1);
????Test2();
}
void?Test2()
{
????TRACK(Test2);
????
????//查看調用堆棧信息
????const?std::vector<CallStack::CallInfo>&?stack?=?g_CallStack.GetCallStack();
}
void?main()
{
????TRACK(main);
????Test1();
}
轉載于:https://www.cnblogs.com/codezhang/archive/2012/01/04/2312424.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的一种获取过程调用堆栈信息的简单方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML表单的enctype属性详解{转
- 下一篇: SQL语句优化方法