使用 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.mfbz.cn/a/610141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?

一、安全特性 在上篇文章中&#xff0c;我们了解到HTTP在通信过程中&#xff0c;存在以下问题&#xff1a; 通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能被窃听不验证通信方的身份&#xff0c;因此有可能遭遇伪装而HTTPS的出现正是解决这些问题&#xff0c…

基于springboot + vue 实现的简易博客系统

项目效果图 登陆页面 文章列表 发表文章 用户管理 栏目管理 数据统计 后端技术栈后端主要采用了&#xff1a; 1.SpringBoot 2.SpringSecurity 3.MyBatis 4.部分接口遵循Restful风格 5.MySQL 前端技术栈前端主要采用了&#xff1a; 1.Vue 2.axios 3.Elemen…

ETL如何执行Java脚本

ETLCloud提供了执行 Java 脚本的方式&#xff0c;让用户能够灵活地处理数据并实现各种复杂的数据处理任务。 ETLCloud在数据处理领域的应用优势主要体现在以下几个方面&#xff1a; 灵活性&#xff1a;通过执行Java脚本&#xff0c;用户能够灵活定制数据处理逻辑&#xff0c;满…

C语言---使用共用体将double型经纬度存储到无符号数组中

1.在上报经纬度时由于数据协议限制需要将double型数据存储到无符号数组中&#xff0c;下边是写了一个简单C程序进行验证&#xff1b; 2.代码示例如下 #include <stdio.h> typedef union {float data;unsigned char arr[4]; } my_data;int main() {my_data test_data {…

IDEA HTTP Client 插件配置空密码的 Request

最近在测试一些 rest api 的时候&#xff0c;发现 IDEA 的 HTTP Client 很好用。对比 postman 更加的轻量&#xff0c;可以满足一些简单的 HTTP 请求测试。这里主要记录下&#xff0c;当用户名没有设置密码时&#xff0c;我们该如何配置这个 HTTP Client 的 Request 文件&#…

综合内容运营实习生实习体验报告怎么写?

分享一个笔灵ai生成的综合内容运营的实习体验报告&#xff0c;有别的岗位需要的可以自己去网站使用 实习体验报告AI写作助手 | AI文章智能生成器 - 笔灵AI写作 实习体验报告 尊敬的领导&#xff1a; 您好&#xff01;我很荣幸有机会向您提交我的实习体验报告。在过去的几个月…

wpf中的图标字体和android的矢量图vector

1.背景 在安卓程序中如下截图所示中&#xff0c;在drawable文件夹下有如下图片文件。 这是一个xml文件&#xff0c;打开后看到Vector节点下paht中有一个pathData属性有一串带字母数字和"."点的数据。这些是什么呢&#xff1f; <vector xmlns:android"http:…

14个项目带你熟练学握AI2G免费分享|一门让你掌握人工智能能力的实操课(送工具)利用Midjourney

目录 1-一门让你掌握人工智能能力的实操课&#xff08;送工具&#xff09;.mp4 10-成为UI设计师&#xff1a;利用Midjourney进行页面UI设计.mp4 11-做室内设计师&#xff1a;利用Midjourney产出家居、室内设计方案.mp4 12-故事绘本&#xff1a;利用Midjouney准备课件、故事…

PCIe协议之-TLP路由基础

✨前言&#xff1a; 在PCI Express (PCIe) 技术中&#xff0c;数据包的路由方式对于确保信息能够高效、准确地传送至目标设备至关重要。PCIe定义了几种路由方式&#xff0c;主要有以下几种。 &#x1f31f;地址路由&#xff08;Address Based Routing&#xff09; 这是最基本…

自动驾驶系统中的数据闭环:挑战与前景

目录 自动驾驶概况 1.1自动驾驶分级 1.2自动驾驶国内发展 ​1.3自动驾驶架构模型 数据闭环的意义 2.1 搜集corner case的数据 2.2 提高模型的泛化能力 2.3 驱动算法迭代 数据闭环落地的痛点及对策 3.1 数据采集和使用的合规性问题 3.2 数据确权问题 3.3 数据采集…

【经验总结】 常用的模型优化器

优化器是一种用于优化模型权重和偏差的算法&#xff0c;它根据训练数据更新模型参数&#xff0c;以模型的预测结果更加准确。 1. 常见的优化器 SGD&#xff08;Stochastic Gradient Descent&#xff09;&#xff1a;SGD是一种基本的优化算法&#xff0c;它在每次迭代中随机选择…

揭秘Ping32如何实现上网行为监控

企业上网行为管理软件在现代企业管理中扮演着举足轻重的角色。它不仅能够监控和记录员工的上网行为&#xff0c;还能有效防止数据泄露和不当使用&#xff0c;从而保障企业的信息安全。 一、Ping32上网监控软件的具体功能包括&#xff1a; 1.网页浏览监控&#xff1a;对Chrome…

jvm面试题30问

什么是JVM的跨平台&#xff1f; 什么是JVM的语言无关性&#xff1f; 什么是JVM的解释执行 什么是JIT? JIT&#xff1a;在Java编程语言和环境中&#xff0c;即时编译器&#xff08;JIT compiler&#xff0c;just-in-time compiler&#xff09;是一个把Java的字节码&#xff08;…

流量卡就该这么选,用起来性价比真的超高!

很多朋友会私信小编&#xff0c;让小编给大家推荐几款流量卡&#xff0c;在这里小编告诉大家&#xff0c;流量卡可以推荐&#xff0c;但是每个人的喜好不同&#xff0c;小编也忙不过来&#xff0c;今天&#xff0c;小编整理了一篇选购指南&#xff0c;大家可以参考选择&#xf…

2024 B2B企业出海营销白皮书(展会篇)

来源&#xff1a;科特勒&微吼 根据36氪研究院发布的《2023-2024年中国企业出海发展研究报告》中指出&#xff0c;随着全球化浪潮席卷以及中国智造的崛起&#xff0c;中国企业出海主力从过去的低附加值行业逐步扩展至信息技术、先进制造、医疗健康、汽车交通、新消费等附加…

106短信平台疑难解答:为何手机正常却收不到短信?

当您使用群发短信平台发送消息时&#xff0c;有时尽管系统提示发送成功&#xff0c;但手机却未能收到短信。这背后可能隐藏着一些不为人知的原因。 首先&#xff0c;我们要明确&#xff0c;在正常情况下&#xff0c;只要手机状态正常&#xff0c;都应该能够接收到短信。然而&am…

为什么站长们喜欢使用新加坡站群服务器呢?

为什么站长们喜欢使用新加坡站群服务器呢? 站群优化一直是站长们追逐的目标之一&#xff0c;而新加坡站群服务器则备受站长们的青睐。为什么会如此呢?让我们深入了解一下。 为什么站长们喜欢使用新加坡站群服务器呢? 站群&#xff0c;简单来说&#xff0c;就是一组相互关联…

Python专题:十、字典(1)

数据类型:字典,是一个集合性质的数据类型 字典的初始化 字典{关键字:数值} 新增元素 修改元素 字典元素访问 字典[关键字} in 操作符 字典关键字检测 字典元素遍历 ①遍历关键字

Android build.prop生成过程源码分析

Android的build.prop文件是在Android编译时刻收集的各种property【LCD density/语言/编译时间, etc.】&#xff1b;编译完成之后&#xff0c;文件生成在out/target/product/<board【OK1000】>/system/目录下&#xff1b;在Android运行时刻可以通过property_get()[c/c域] …

深度学习论文: LightGlue: Local Feature Matching at Light Speed

深度学习论文: LightGlue: Local Feature Matching at Light Speed LightGlue: Local Feature Matching at Light Speed PDF: https://arxiv.org/pdf/2306.13643 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/…