hendestan kino 2015:通过编程方式获取backtrace
来源:百度文库 编辑:偶看新闻 时间:2024/04/28 01:00:00
在用GDB调试器时可以查看所谓的Backtrace,它包含一系列的函数调用信息,用命令backtrace或bt可以在GDB中查看函数调用栈的信息。有些场合没法使用GDB时,则可以用glibc库函数中的一些相关函数来得到backtrace的信息(在头文件execinfo.h中):
// 获取将backstrace信息,将地址存到buffer中。
// 参数size指定buffer的最大值,返回值则是backstrace的实际大小
int backtrace (void **buffer, int size)
// 根据buffer指定的地址,返回符号信息。参数size指定返回符号信息的大小
char ** backtrace_symbols (void *const *buffer, int size)
// 类似backtrace_symbols()函数,但是不需要malloc空间来存放符号信息,
// 而是将结果写到文件描述符fd所代表的文件中
void backtrace_symbols_fd (void *const *buffer, int size, int fd)
使用函数backtrace_symbols()或者backtrace_symbols_fd()时,需要用-rdynamic编译才能得到正确的符号名,否则只能得到偏移地址。
下面的示例代码应用了backtrace()和backtrace_symbols()函数来打印backtrace的信息:
1 #include
2 #include
3 #include
4
5
6 void print_trace (void)
7 {
8 void *array[10];
9 size_t size;
10 char **strings;
11 size_t i;
12
13 size = backtrace (array, 10);
14 strings = backtrace_symbols (array, size);
15
16 printf ("Obtained %zd stack frames.\n", size);
17
18 for (i = 0; i < size; i++)
19 printf ("%s\n", strings[i]);
20
21 free (strings);
22 }
23
24
25 void dummy_function (void)
26 {
27 print_trace ();
28 }
29
30 int main (void)
31 {
32 dummy_function ();
33 return 0;
34 }
编译运行的结果如下:
# gcc bt.c -rdynamic -o bt
# ./bt
Obtained 5 stack frames.
./bt(print_trace+0x14) [0x80486e4]
./bt(dummy_function+0xb) [0x8048765]
./bt(main+0x15) [0x 804877c]
/lib/tls/libc.so.6(__libc_start_main+0xe4) [0x42015574]
./bt(backtrace_symbols+0x31) [0x8048641]
你可以应用这些函数在程序异常退出时打印backtrace或将它保存到某个文件中,用于之后的分析。更详细的介绍可以参考http://www.linuxjournal.com/article/6391。
// 获取将backstrace信息,将地址存到buffer中。
// 参数size指定buffer的最大值,返回值则是backstrace的实际大小
int backtrace (void **buffer, int size)
// 根据buffer指定的地址,返回符号信息。参数size指定返回符号信息的大小
char ** backtrace_symbols (void *const *buffer, int size)
// 类似backtrace_symbols()函数,但是不需要malloc空间来存放符号信息,
// 而是将结果写到文件描述符fd所代表的文件中
void backtrace_symbols_fd (void *const *buffer, int size, int fd)
使用函数backtrace_symbols()或者backtrace_symbols_fd()时,需要用-rdynamic编译才能得到正确的符号名,否则只能得到偏移地址。
下面的示例代码应用了backtrace()和backtrace_symbols()函数来打印backtrace的信息:
1 #include
2 #include
3 #include
4
5
6 void print_trace (void)
7 {
8 void *array[10];
9 size_t size;
10 char **strings;
11 size_t i;
12
13 size = backtrace (array, 10);
14 strings = backtrace_symbols (array, size);
15
16 printf ("Obtained %zd stack frames.\n", size);
17
18 for (i = 0; i < size; i++)
19 printf ("%s\n", strings[i]);
20
21 free (strings);
22 }
23
24
25 void dummy_function (void)
26 {
27 print_trace ();
28 }
29
30 int main (void)
31 {
32 dummy_function ();
33 return 0;
34 }
编译运行的结果如下:
# gcc bt.c -rdynamic -o bt
# ./bt
Obtained 5 stack frames.
./bt(print_trace+0x14) [0x80486e4]
./bt(dummy_function+0xb) [0x8048765]
./bt(main+0x15) [0x 804877c]
/lib/tls/libc.so.6(__libc_start_main+0xe4) [0x42015574]
./bt(backtrace_symbols+0x31) [0x8048641]
你可以应用这些函数在程序异常退出时打印backtrace或将它保存到某个文件中,用于之后的分析。更详细的介绍可以参考http://www.linuxjournal.com/article/6391。
网站通过什么方式获取利润?
电视台是通过什么方式获取利润的?
请问百度是通过什么方式获取利润的
如何通过windows命令行方式获取"肉鸡"
通过套接字编程,客户端程序能够从服务端程序获取服务端的时间
请问怎么通过编程获取移动终端(如PDA、手机等)的硬件信息?
我用JSP编程,想要通过下拉列表框获取值,怎么办?
我可以通过什么样的方式来获取自己的网站
怎样才能 防止其它计算机通过网络以匿名方式获取到本机的信息?
装XP5.0系统的手机,可不可以通过装软件的方式获取收音机功能?
装win5.0系统的手机,可不可以通过装软件的方式获取收音机功能?
资源获取的方式
获取领土的方式
我家里有两台电脑,一台可以通过自动获取ip的方式上互联网,另一台不能?
防火墙告诉我:“其他的计算机可以通过网络,以匿名方式获取到本机信息”,该怎么办?
asp.net 通过编程方式操作数据库行吗?像asp那样。
怎样修改IP获取方式
大脑通过什么获取信息?
大脑通过什么获取信息?
怎样才能通过网络获取财富
通过鼠标点击编程
其他的计算机可以通过网络,以匿名方式获取到本机的信息```要怎么修改才能让人访问受限
瑞星漏洞扫描它扫描出:“其他的计算机可以通过网络,以喏名方式获取到本机的信息。”怎么解决这个漏洞?
黑客采取什么方式获取密码