使用 backtrace 调测 SIGSEGV 信号 ---- 打印寄存器值

#define _GNU_SOURCE

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

/*
 * backtrace和bacetrace_symbols打印出回溯信息
 */
 
#if 0
#include <execinfo.h>

int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd);

#endif


static void signal_handler(int sig, siginfo_t *info, void *ctx)
{
    ucontext_t *context = (ucontext_t *)ctx;

    /* dump registers, x64 CPU specific */
    printf( "Signal = %d  Memory location = %p\n"
            "RIP = %016X  RSP = %016X  RBP = %016X\n"
            "RAX = %016X  RBX = %016X  RCX = %016X\n"
            "RDX = %016X  RSI = %016X  RDI = %016X\n"
            "R8  = %016X  R9  = %016X  R10 = %016X\n"
            "R11 = %016X  R12 = %016X  R13 = %016X\n"
            "R14 = %016X  R15 = %016X  RFLAGS = %016X\n\n",
            sig, info->si_addr,
            context->uc_mcontext.gregs[REG_RIP],
            context->uc_mcontext.gregs[REG_RSP],
            context->uc_mcontext.gregs[REG_RBP],
            context->uc_mcontext.gregs[REG_RAX],
            context->uc_mcontext.gregs[REG_RBX],
            context->uc_mcontext.gregs[REG_RCX],
            context->uc_mcontext.gregs[REG_RDX],
            context->uc_mcontext.gregs[REG_RSI],
            context->uc_mcontext.gregs[REG_RDI],
            context->uc_mcontext.gregs[REG_R8],
            context->uc_mcontext.gregs[REG_R9],
            context->uc_mcontext.gregs[REG_R10],
            context->uc_mcontext.gregs[REG_R11],
            context->uc_mcontext.gregs[REG_R12],
            context->uc_mcontext.gregs[REG_R13],
            context->uc_mcontext.gregs[REG_R14],
            context->uc_mcontext.gregs[REG_R15],
            context->uc_mcontext.gregs[REG_EFL]);

    /* get call stack and write to stdout */
    void *buf[256] = {0};
    int size = backtrace(buf, 256);
    backtrace_symbols_fd(buf, size, fileno(stdout));
    exit(-1);
}

void test_3(int *p)
{
    *p = 1;
}

void test_2(int *p)
{
    test_3(p);
}

void test_1(int *p)
{
    test_2(p);
}

int main(int argc, char *argv[])
{
    int *p = 0x12345678;

    struct sigaction action;
    sigemptyset(&action.sa_mask);
    action.sa_sigaction = signal_handler;
    action.sa_flags = SA_SIGINFO;

    sigaction(SIGSEGV, &action, NULL);

    test_1(p);
    return 0;
}

// gcc -rdynamic backtrace2.c -o backtrace2


#if 0

000000000000143f <test_3>:
    143f:    f3 0f 1e fa              endbr64
    1443:    55                       push   %rbp
    1444:    48 89 e5                 mov    %rsp,%rbp
    1447:    48 89 7d f8              mov    %rdi,-0x8(%rbp)
    144b:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    144f:    c7 00 01 00 00 00        movl   $0x1,(%rax)                 // SIGSEGV
    1455:    90                       nop
    1456:    5d                       pop    %rbp
    1457:    c3                       retq   

0000000000001458 <test_2>:
    1458:    f3 0f 1e fa              endbr64
    145c:    55                       push   %rbp
    145d:    48 89 e5                 mov    %rsp,%rbp
    1460:    48 83 ec 08              sub    $0x8,%rsp
    1464:    48 89 7d f8              mov    %rdi,-0x8(%rbp)
    1468:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    146c:    48 89 c7                 mov    %rax,%rdi
    146f:    e8 cb ff ff ff           callq  143f <test_3>
    1474:    90                       nop
    1475:    c9                       leaveq
    1476:    c3                       retq   

0000000000001477 <test_1>:
    1477:    f3 0f 1e fa              endbr64
    147b:    55                       push   %rbp
    147c:    48 89 e5                 mov    %rsp,%rbp
    147f:    48 83 ec 08              sub    $0x8,%rsp
    1483:    48 89 7d f8              mov    %rdi,-0x8(%rbp)
    1487:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    148b:    48 89 c7                 mov    %rax,%rdi
    148e:    e8 c5 ff ff ff           callq  1458 <test_2>
    1493:    90                       nop
    1494:    c9                       leaveq
    1495:    c3                       retq   

Signal = 11  Memory location = 0x12345678
RIP = 000000000C0E744F  RSP = 00000000029CAB30  RBP = 00000000029CAB30
RAX = 0000000012345678  RBX = 000000000C0E7540  RCX = 00000000317BE166
RDX = 0000000000000000  RSI = 00000000029CAA20  RDI = 0000000012345678
R8  = 0000000000000000  R9  = 0000000000000000  R10 = 0000000000000008
R11 = 0000000000000246  R12 = 000000000C0E7140  R13 = 00000000029CAD20
R14 = 0000000000000000  R15 = 0000000000000000  RFLAGS = 0000000000010202

./backtrace2(+0x1407)[0x56150c0e7407]           // backtrace
/lib/x86_64-linux-gnu/libc.so.6(+0x43090)[0x7f38317be090]
./backtrace2(test_3+0x10)[0x56150c0e744f]       // SIGSEGV
./backtrace2(test_2+0x1c)[0x56150c0e7474]       // test_2 -> test3
./backtrace2(test_1+0x1c)[0x56150c0e7493]       // test_1 -> test2
./backtrace2(main+0x86)[0x56150c0e751c]         // main -> test_1
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x7f383179f083]
./backtrace2(_start+0x2e)[0x56150c0e716e]

#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

监控异地组网怎么组网?

监控异地组网是指在不同地域的网络环境下&#xff0c;实现对监控设备的远程访问和管理。在传统的网络环境下&#xff0c;由于网络限制和设备配置等问题&#xff0c;监控设备的远程访问往往受到一定的限制和困扰。为了解决这个问题&#xff0c;引入了天联组网技术&#xff0c;实…

.Net WinFrom中DataGridView控件的熟练学习

是一个熟练掌握DataGridView的Demo 1、里边讲述了如果使用DataGridView数据导出到Excel中&#xff0c;以及Excel数据导入到数据中 2、实现了DataGridView复选框批量删除&#xff0c;按钮进入详细信息&#xff0c;按钮删除等功能 3、实现了根据数据的条件不同行显示的颜色不同以…

黑马点评项目笔记

短信登录 基于session的短信登录 发送验证码&#xff0c;session保存验证码。验证验证码&#xff0c;session保存用户信息。校验登录状态&#xff0c;判断session里是否保存用户信息。 使用ThreadLocal保存用户信息&#xff0c;是方便后面业务获取当前用户&#xff0c;避免传…

安卓开发--按键背景图片,按键其他属性,按键按键按下变色

前面已经介绍了一个空白按键工程的建立以及响应方式&#xff0c;可以参考这里&#xff1a;安卓开发–新建工程&#xff0c;新建虚拟手机&#xff0c;按键事件响应。 安卓开发是页面跳转是基础&#xff01;&#xff01;&#xff01;所以本篇博客介绍利用按键实现页面跳转&#…

添加对象方法

添加对象方法的方法如下&#xff0c;这是一个通用模式 注意灵活运用。

数据库调优-SQL语句优化

2. SQL语句优化 sql 复制代码 # 请问这两条SQL语句有什么区别呢&#xff1f;你来猜一猜那条SQL语句执行查询效果更好&#xff01; select id from sys_goods where goods_name华为 HUAWEI 麦芒7 魅海蓝 6G64G 全网通; ​ select id from sys_goods where goods_id14967325985…

Redis学习1——redis简介、基础

介绍 redis简介 Redis(Remote Dictonary Server) 是由Salvatore Sanfilippo开发的key-value缓存数据库&#xff0c;基于C语言开发。目前市面上&#xff0c;Redis和MongoDB是当前使用最广泛的NoSQL&#xff0c;而就Redis技术而言&#xff0c;它的性能十分优越&#xff0c;可以…

仿真相关知识积累

融合模型是什么 集成学习 融合模型&#xff0c;也称为集成学习&#xff0c;是一种将多个基模型组合在一起以提升整体模型性能的方法。这种思想通过不同的策略将多个相对较弱的模型&#xff08;学习器&#xff09;结合起来&#xff0c;从而达到较强的模型性能。

rngd: Error writing /dev/tpm0

检查数据库时发现messages中一直有rngd报错&#xff0c;rngd一直未配置&#xff0c;直接关闭了 /var/log/messages-20240414:Apr 11 04:59:49 hydb2 rngd: Error writing /dev/tpm0 /var/log/messages-20240414:Apr 12 07:31:39 hydb2 rngd: Error writing /dev/tpm0 /var/log…

shell-for循环语句练习题

1.计算从1到100所有整数的和 [rootlocalhost ~]# vim 1.sh #!/bin/bash sum0 #定义变量sum初始值为0 for i in {1..100} #for循环 i取值从1到100 do sum$[ isum ] #在每次循环中&#xff0c;变量i的值会依次取1到100的整数值。 #sum是一个累加器&#xff0c;初始值…

echarts自定义图例显示名称、数值、占比

先上代码 legend: {orient: vertical,left: 10,top:20,data: data,textStyle: {color: #9FB7D5 // 设置图例文字颜色为白色},// type: plain, // 设置图例类型为普通类型itemWidth: 10, // 设置图例项的宽度itemHeight: 10, // 设置图例项的高度formatter: function(name) {let…

Python专题:十、字典(2)

字典定义x{} get()函数 get&#xff08;参数一&#xff0c;参数二&#xff09; 参数一&#xff1a; 需要查找的关键词 参数二&#xff1a; 如果关键词不存在get返回的默认值 字典的更新 update&#xff08;&#xff09;函数&#xff0c;字典y的元素&#xff0c;去更新字…

学生管理系统初级

根据题目要求生成大纲 总结: 1.在书写时&#xff0c;考虑到了书写时id可是是abc... 类型是String&#xff0c;但在根据id获取集合中元素时 list.get() &#xff0c;get&#xff08;&#xff09;里面是int类型。 2.在书写还有一点功能并不完全&#xff0c; 2.1查找时是打印所有…

缓存雪崩、缓存击穿、缓存穿透是什么、之间的区别及解决办法

缓存雪崩、缓存击穿、缓存穿透&#xff1a; 详细介绍看这篇文章&#xff0c;写得很好&#xff1a; 什么是缓存雪崩、缓存击穿、缓存穿透 下面是我自己总结的&#xff0c;比较简单清楚地展示了缓存雪崩、缓存击穿和缓存穿透的根本区别和相应的解决办法。强烈建议看完上述文章后…

十.吊打面试官系列-Tomcat优化-通过压测Tomcat调优实战

前言 上一篇文章我们讲解了一下Tomcat底层的结构和执行原理&#xff0c;我们需要重点去掌握的是Tomcat的高内聚低耦合的设计&#xff0c;以及责任链模式&#xff0c;以及Tomcat NIO编程模式&#xff0c;这些是Tomcat比较核心的点&#xff0c;本篇文章我们将对Tomcat的参数做一…

Java学习【类与对象】

类和对象 开始我们就不讲那些把大象放冰箱需要几步来引入面向对象的例子了&#xff0c;直接上干货。 在Java中&#xff0c;类是对现实世界中某一类事物的抽象描述。它包含了该类事物的属性和方法。属性用于描述事物的状态&#xff0c;而方法则用于描述事物可以做的事情。对象也…

Redis 支持的 Java 客户端都有哪些?

Redis 是一种高性能的键值存储系统&#xff0c;它以其快速、灵活和可扩展的特性而闻名。在 Java 开发中&#xff0c;与 Redis 交互的方式通常是通过使用 Redis 的 Java 客户端。 这些客户端提供了访问 Redis 数据库的接口&#xff0c;使开发人员能够在 Java 应用程序中轻松地使…

MongoDB聚合运算符:$topN

MongoDB聚合运算符&#xff1a;$topN 文章目录 MongoDB聚合运算符&#xff1a;$topN语法用法关于null和缺失值的处理BSON数据类型排序 举例查找三个得分最高的查找全部游戏中三个最高的得分基于分组key来计算参数n $topN聚合运算符返回分组中指定顺序的最前面 n个元素&#xf…

使得安全团队难以准确评估网络的真实安全状况

防火墙策略管理与策略分析&#xff1a;如何准确评估网络真实安全状况 摘要 随着信息技术的飞速发展&#xff0c;网络安全问题日益严重。防火墙作为网络安全的第一道防线&#xff0c;对于保障网络的安全具有重要意义。然而&#xff0c;在实际应用中&#xff0c;由于防火墙策略管…

704. 二分查找

Problem: 704. 二分查找 &#x1f437;我的leetcode主页 文章目录 题目分类思路什么是二分查找如何理解时间复杂度 解题方法Code 题目 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&a…