IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 使用信号机制在Linux程序中打印函数调用栈 -> 正文阅读

[C++知识库]使用信号机制在Linux程序中打印函数调用栈

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>
#include <ucontext.h>

void handler(int signo, siginfo_t *info, void *context)
{
        ucontext_t* ctx = (ucontext_t*)context;

        void *trace[16];
        char **messages = (char **)NULL;
        int i, trace_size = 0;

        trace_size = backtrace(trace, 16);

        /* overwrite sigaction with caller's address */
        trace[1] = (void *)ctx->uc_mcontext.gregs[REG_RIP];
        messages = backtrace_symbols(trace, trace_size);

        /* skip first stack frame (points here) */
        printf("[bt] Execution path:\n");
        for (i = 1; i < trace_size; ++i)
        {
                printf("[bt] #%d %s\n", i, messages[i]);

                /* find first occurence of '(' or ' ' in message[i] and assume
                 * everything before that is the file name. (Don't go beyond 0 though
                 * (string terminator)*/
                size_t p = 0;
                while(messages[i][p] != '(' && messages[i][p] != ' ' && messages[i][p] != 0)
                        ++p;

                char syscom[256];

                /* /usr/bin/addr2line */
                sprintf(syscom,"addr2line %p -e %.*s", trace[i], p, messages[i]);

                //last parameter is the file name of the symbol
                system(syscom);
        }

        exit(EXIT_SUCCESS);
}

int func_a(int a, char b) 
{
        char *p = (char *)0xdeadbeef;
        a = a + b;
        *p = 10;  /* CRASH here!! */

        return 2 * a;
}


int func_b() 
{
        int res, a = 5;
        res = 5 + func_a(a, 't');
        return res;
}


int main() 
{
        struct sigaction sa={0} ;

        /* Install our signal handler */
        sa.sa_sigaction = &handler;
        sigemptyset(&sa.sa_mask);
        sa.sa_flags = SA_RESTART;

        sigaction(SIGSEGV, &sa, NULL);
        sigaction(SIGUSR1, &sa, NULL);

        /* Do something */
        printf("%d\n", func_b());
        //raise(SIGSEGV);
}

编译

gcc -g -rdynamic *.cpp -o bs
?

运行

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:18:35  更:2022-03-24 00:19:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:12:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码