tc_ex中有异常类TC_Exception, 类中没有什么太多的功能, 对理解整个tars的作用不大。 尽管如此, 还是来看看如下函数:
void TC_Exception::getBacktrace()
{
void * array[64];
int nSize = backtrace(array, 64);
char ** symbols = backtrace_symbols(array, nSize);
for (int i = 0; i < nSize; i++)
{
_buffer += symbols[i];
_buffer += "\n";
}
free(symbols);
}
从名字看, 就是获取堆栈信息, man了一下, 看个man上的例子:
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
myfunc3(void)
{
int j, nptrs;
#define SIZE 100
void *buffer[100];
char **strings;
nptrs = backtrace(buffer, SIZE);
printf("backtrace() returned %d addresses\n", nptrs);
/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
would produce similar output to the following: */
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings);
}
static void /* "static" means don't export the symbol... */
myfunc2(void)
{
myfunc3();
}
void
myfunc(int ncalls)
{
if (ncalls > 1)
myfunc(ncalls - 1);
else
myfunc2();
}
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "%s num-calls\n", argv[0]);
exit(EXIT_FAILURE);
}
myfunc(atoi(argv[1]));
exit(EXIT_SUCCESS);
}
结果:
ubuntu@VM-0-15-ubuntu:~/taoge/cpp$ ./a.out 4
backtrace() returned 9 addresses
./a.out() [0x400844]
./a.out() [0x400912]
./a.out() [0x40093a]
./a.out() [0x400933]
./a.out() [0x400933]
./a.out() [0x400933]
./a.out() [0x400996]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7fc87643c830]
./a.out() [0x400749]
ubuntu@VM-0-15-ubuntu:~/taoge/cpp$
可见, 跟gdb的bt命令差不多, bt就是backtrace的缩写, 回溯的意思, 在计算机中, 可以理解为堆栈的回溯, 层层调用。 很久以前, 某次面试, 面试官问我怎么看堆栈, 我居然不知道, 囧。
总体来说, tc_ex就是一些异常处理, 不难搞懂。