百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

没有core文件如何查代码core

bigegpt 2024-09-03 11:02 3 浏览

对于C/C++程序员来说,如果程序core dump了,没有core文件就很难知道发生了什么,只能重新更改系统配置,让core文件产生(通常是在.bash_profile中,加上ulimit -c unlimited),以便下次core的时候可以产生core文件,方便调试,除此之外,还是有其他办法的,那就是采用查看dmesg和add2line方式来定位core的位置。

一 dmesg

dmesg 用来显示内核环缓存区内容(kernel-ring buffer),,内核将各种消息放这里。硬件和模块初始化信息填充在这里面,还有程序oom了,或者程序core了,也可以从这里面看到些蛛丝马迹,遇到疑难问题,我挺喜欢用这个命令查看下的,不过如果简单输入dmesg,打印出来的信息没有具体时间,如下:

[    6.396632] ip_tables: (C) 2000-2006 Netfilter Core Team
[    6.397395] systemd[1]: Inserted module 'ip_tables'
[    6.829500] EXT4-fs (vda1): re-mounted. Opts: (null)
[    6.971834] systemd-journald[474]: Received request to flush runtime journal from PID 1
[    7.228993] piix4_smbus 0000:00:01.3: SMBus Host Controller at 0x700, revision 0
[    7.241443] input: PC Speaker as /devices/platform/pcspkr/input/input5
[    7.273676] cryptd: max_cpu_qlen set to 1000
[    7.288223] AVX2 version of gcm_enc/dec engaged.
[    7.288970] AES CTR mode by8 optimization enabled
[    7.332362] alg: No test for __gcm-aes-aesni (__driver-gcm-aes-aesni)
[    7.340363] alg: No test for __generic-gcm-aes-aesni (__driver-generic-gcm-aes-aesni)
[    7.381571] ppdev: user-space parallel port driver
[    7.571710] type=1305 audit(1615624005.114:3): audit_pid=712 old=0 auid=4294967295 ses=4294967295 res=1
[    7.747291] random: crng init done

为了更容易看,可以通过-H参数里面会显示具体时间,加上-L 参数,彩色打印,如下:

二 利用addr2line定位core的位置

写个简单的例子,如下:

#include <stdio.h>

int main(int argc ,char*  argv[])
{
  int *p = NULL;
   *p = 0;
  printf(" core\n");
  return 0;
}

因为p指针没有分配地址,所以*p =0 会core,输入dmesg 显示如下:

[3307172.176109] 1[10848]: segfault at 0 ip 0000000000400578 sp 00007ffcb052a550 error 6 in 1[400000+1000]

编译下:

 g++ -g 1.c -o abc

运行:./abc,会core,通过dmesg我们来查看下core的信息:

来看下如下信息:

abc[10870]: segfault at 0 ip 0000000000400578 sp 00007fff22cccb60 error 6 in abc[400000+1000]

其中abc为程序名字,10870为运行时候的进程ID,segfault at引起故障的地址为0,ip 表示core的内存地址:0000000000400578 ,sp 后面地址为堆栈指针地址,这个没啥用, error 6这个比较重要,是为多种原因的位运算得到的结果:

error code是位运算,说明:

bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址

6换成二进制是:110 即 是用户态程序内存访问越界和写操作导致内存访问越界。 知道指令的地址,就可以查看地址对应的代码位置,命令如下:

[root@iZbp10p2g1civrw4ggigvfZ soft]# addr2line  -s -f -e ./abc  0000000000400578
main
1.c:6

顺利定义到代码在1.c文件的第六行。

三 利用addr2line定位库中core的位置

写一个一定会core的代码,如下:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main(int argc ,char*  argv[])
  5 {
  6   char * pstr = NULL;
  7   char * pstr2 = (char*)malloc(sizeof(char)*10);
  8   memcpy(pstr,pstr2,20);
  9   printf(" core\n");
 10   return 0;
 11 }

运行下dmesg查看core信息:

[3390574.284000] def[18554]: segfault at 0 ip 00007f0c420f8c16 sp 00007fff9e6dee98 error 6 in libc-2.17.so[7f0c41fa2000+1c3000]

由于core的位置在库中,首先库的基地址为:7f0c41fa2000, core的位置为00007f0c420f8c16 ,计算下core的位置在库中的偏移量:

>>> 0x7f0c420f8c16-0x7f0c41fa2000
1403926
>>> hex(1403926)
'0x156c16'

找到动态库,反编译出汇编代码,根据地址进行定位:

objdump  -DCgl libc-2.17.so  > 1.txt
# 搜索:156c16
vim 1.txt

运气好的话,线上移动可以看到定位到的函数,如果运气一般,还是无法查到具体的core的库函数,如下图:

四 诗词欣赏 炎黄
-- 作者:天涯在小楼 原名:方哲萱 写于2003年左右。
当我登上那古老的城墙,当我抚摸着腐朽的柱梁,
当我兴奋地倚栏远望,总会有一丝酸涩冲上喉头,
总听到有一个声音大声的说:记得吗?你的祖先名叫炎黄。

有人跟我说,曾经有一条大鱼,生活在北冥那个地方,它化作一只巨鸟,在天地之间翱翔。巨鸟有如垂天之云般的翅膀,虽九万里亦可扶摇直上。
圣贤赋予我们可以囊括天宇的胸襟,为我们塑造一个博大恢弘的殿堂。

那时候,有个怪异的青年名叫嵇康,他临刑前,弹奏了一曲绝响,那宽袍博带在风中飞扬,他用了最优雅的姿态面对死亡。
几千年过去,依旧有余音绕梁,只是他不知道,真正断绝的不是曲谱,而是他的傲骨,乃至他身上的衣裳。

我也曾梦回大唐,和一个叫李白的诗人云游四方,他用来下酒的是剑锋上的寒光,他的情人是空中的月亮。
我曾见他在月下徘徊、高歌吟唱,长风吹开他的发带,长袍飘逸宛如仙人模样。

可是后来换了帝王,他用一杯酒捧起了文人,摒弃了武将。他的子孙最终躲进了人间天堂,把大片的土地拱手相让。
然而在寒冷的北方,正有一支军队征战沙场,敌人都说,有岳家军在,我们打不了胜仗。
可叹英雄遭忌,谗士高张,一缕忠魂终于消散在西湖之傍,一个民族的精神就这么无可逆转的消亡。
然而血色夕阳中,我依稀见到,有人把它插进土壤,那是将军用过的,一支宁折不弯的缨枪。


时间的车轮悠悠荡荡,终于在甲申那里失了方向。于是瘦西湖畔,梅花岭上,为纪念这个悲剧建起一座祠堂。
那个叫史可法的文弱书生,他不愿散开高束的发髻,更不能脱去祖先留给他的衣裳,于是他决定与城共存共亡,丢了性命,护了信仰。残酷的杀戮,如山的尸骨,并不能把民族的精神埋葬,有人相信,千百年后,它依然会在中华大地上熠熠发光。

就在千百年后的今天,我坐进麦当劳的厅堂,我穿起古驰牌的时装,我随口唱着《my heart will go on》,却莫名其妙的心伤,因为我听到一个声音大声的说:忘了吗?你的祖先名叫炎黄。

我记得了,一群褐发蓝眼的豺狼,带着尖船利炮,拆了我们的庙宇,毁了我们的殿堂。于是百年之后的今天——我们懂得民主自由,却忘了伦理纲常,我们拥有音乐神童,却不识角徵宫商,我们能建起高楼大厦,却容不下一块公德牌坊,我们穿着西服革履,却没了自己的衣裳。
在哪里,那个礼仪之邦?
在哪里,我的汉家儿郎?
为什么我穿起最美丽的衣衫,你却说我行为异常?
为什么我倍加珍惜的汉装,你竟说它属于扶桑?

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...