日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一种获取过程调用堆栈信息的简单方法

發布時間:2025/4/16 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一种获取过程调用堆栈信息的简单方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在程序崩潰或出現異常時,通常需要給開發人員提供基本的過程調用的信息,這里給出一個簡單的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位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的一种获取过程调用堆栈信息的简单方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。