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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

获取函数调用堆栈

發(fā)布時(shí)間:2023/12/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取函数调用堆栈 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

int backtrace(void **buffer,int size)

該函數(shù)用于獲取當(dāng)前線程的調(diào)用堆棧,獲取的信息將會(huì)被存放在buffer中,它是一個(gè)指針列表。參數(shù) size 用來指定buffer中可以保存多少個(gè)void* 元素。函數(shù)返回值是實(shí)際獲取的指針個(gè)數(shù),最大不超過size大小。

在buffer中的指針實(shí)際是從堆棧中獲取的返回地址,每一個(gè)堆棧框架有一個(gè)返回地址。

注意:某些編譯器的優(yōu)化選項(xiàng)對(duì)獲取正確的調(diào)用堆棧有干擾,另外內(nèi)聯(lián)函數(shù)沒有堆棧框架;刪除框架指針也會(huì)導(dǎo)致無法正確解析堆棧內(nèi)容。

?

?

1. 代碼:

#include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <execinfo.h> #include <signal.h>void dump(int signo) {void *buffer[30] = {0};size_t size;char **strings = NULL;size_t i = 0;size = backtrace(buffer, 30);fprintf(stdout, "Obtained %zd stack frames.nm\n", size);strings = backtrace_symbols(buffer, size);if (strings == NULL){perror("backtrace_symbols.");exit(EXIT_FAILURE);}for (i = 0; i < size; i++){fprintf(stdout, "%s\n", strings[i]);}free(strings);strings = NULL;exit(0); }void func_c() {*((volatile char *)0x0) = 0x9999; }void func_b() {func_c(); }void func_a() {func_b(); }int main(int argc, const char *argv[]) {if (signal(SIGSEGV, dump) == SIG_ERR)perror("can't catch SIGSEGV");func_a();return 0; }

?

?

2. 編譯

gcc -g -rdynamic fun_trace.c -o test

?

3. 運(yùn)行

[baoliw@AONTFN07 test]$ ./test Obtained 7 stack frames.nm ./test(dump+0x45) [0x80487a9] [0x6ff400] ./test(func_b+0x8) [0x804886c] ./test(func_a+0x8) [0x8048876] ./test(main+0x33) [0x80488ab] /lib/libc.so.6(__libc_start_main+0xe6) [0x126cc6] ./test() [0x80486d1]

?

總結(jié)

以上是生活随笔為你收集整理的获取函数调用堆栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。