Exception类
Exception::Exception(string msg)构造函数的实现
Exception::Exception(string msg)
: message_(std::move(msg)),
stack_(CurrentThread::stackTrace(/*demangle=*/false))
{
}
其中CurrentThread::stackTrace(/demangle=/false)函数的实现
//就是将回溯到的每一个函数名都追加到stack字符中
string stackTrace(bool demangle)
{
string stack;
const int max_frames = 200;
void* frame[max_frames];
//栈回溯,保存各个栈针的地址
//frame中的每一项都是void*类型,用来保存函数地址
//nptrs是实际的个数
int nptrs = ::backtrace(frame, max_frames);
//根据地址,将地址转化为相应的函数符号
//buffer中存储的相当于是各个函数名字的地址
//strings指向存放地址的首地址
char** strings = ::backtrace_symbols(frame, nptrs);
if (strings)
{
size_t len = 256;
//如果demangled为true,则malloc256字节的空间,类型为char*类型
//否则为空指针
char* demangled = demangle ? static_cast<char*>(::malloc(len)) : nullptr;
for (int i = 1; i < nptrs; ++i) // skipping the 0-th, which is this function
{
if (demangle)
{
// https://panthema.net/2008/0901-stacktrace-demangled/
// bin/exception_test(_ZN3Bar4testEv+0x79) [0x401909]
char* left_par = nullptr;
char* plus = nullptr;
for (char* p = strings[i]; *p; ++p)
{
if (*p == '(')
left_par = p;
else if (*p == '+')
plus = p;
}
if (left_par && plus)
{
*plus = '\0';
int status = 0;
//没看懂啊
char* ret = abi::__cxa_demangle(left_par+1, demangled, &len, &status);
*plus = '+';
if (status == 0)
{
demangled = ret; // ret could be realloc()
stack.append(strings[i], left_par+1);
stack.append(demangled);
stack.append(plus);
stack.push_back('\n');
continue;
}
}
}
// Fallback to mangled names
stack.append(strings[i]);
stack.push_back('\n');
}
free(demangled);
free(strings);
}
return stack;
}
** const char* what() const noexcept override函数的实现**
const char* what() const noexcept override
{
return message_.c_str();
}
const char stackTrace() const noexcept函数的实现加粗样式*
const char* stackTrace() const noexcept
{
return stack_.c_str();
}