擅长:python、mysql、java
<p>没有可移植的方法来获取堆栈跟踪,一个诀窍是在函数上下文中使用一个对象来保存信息</p>
<pre><code>struct StackTraceInfo {
const char *filename;
int line;
static std::vector<StackTraceInfo *> stack;
StackTraceInfo(const char *filename, int line) :
filename(filename), line(line)
{
stack.push_back(this);
}
~StackTraceInfo()
{
stack.pop_back();
}
};
#define ENTER StackTraceInfo(__FILE__, __LINE__) sinfo_;
</code></pre>
<p>in every函数只需在主体的最开始添加一行<code>ENTER</code></p>
^{pr2}$
<p>如果在抛出之前发生异常,则需要使用global<code>StackTraceInfo::stack</code>vector的内容保存当前堆栈跟踪,以便显示消息的人可以访问此信息。请注意,您无法访问异常处理程序中的堆栈信息,因为堆栈已在此时展开。在</p>
<p>还请注意,如果应用程序是多线程的,则需要为每个线程使用单独的堆栈,而不是使用全局存储。在</p>