![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
coredump
文章平均质量分 51
总结工作中的Segment Fault,coredump 分析
优惠券已抵扣
余额抵扣
还需支付
¥49.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
mzhan017
小张
展开
-
gdb: could not find ‘.gnu_debugaltlink‘ file for /usr/lib/debug/usr/lib64/libstdc++.so.
意思是说找不(/usr/lib/debug/usr/lib64/libstdc++.so.6.0.25-8.5.0-20.el8.x86_64.debug需要的)到文件.gnu_debugaltlink。最后的解决方法是安装gcc-debuginfo。因为libstdc+±debuginfo, 依赖这个gcc-debuginfo。还是不能图省事不安装。原创 2024-07-17 08:15:50 · 244 阅读 · 0 评论 -
Coredump-X: __cxa_pure_virtual;第一次看到这种
最后调查的原因是,是一个静态变量的析构函数已经在进程退出的时候被调用了,但是其他线程的程序还在使用这个静态变量的成员函数,但是这个时候的vtable值已经变了。最近遇到一个coredump,是在进程退出的时候。通过gdb查看core文件,出现的问题是在__cxa_pure_virtual 函数。也就是在对象的构造函数和析构函数里有些纯虚的函数可能被调用,这个函数也是一个错误上报的方式。要避免在进程执行exit的时候,继续线程的运行。这种类型的coredump还真是第一次遇到。gcc里这个函数的定义。原创 2024-07-16 20:31:22 · 235 阅读 · 0 评论 -
gcc: gsplit-dwarf 后在gdb里遇到的一个问题:如何dwo文件加载
这个时候如果想使用gdb调试程序,gdb的策略是lazy方式加载dwo文件,而且根据indirect(间接)的路径去找dwo文件,如果找不到,就会导致有些变量打印不出来。需要让gdb自己能通过间接路径找到dwo文件。假如使用了gsplit-dwarf选项,而且选择输出dwarf调试信息,这个时候,为了减小可执行文件的大小。链接器会将dwarf的调试信息,单独放到一个新文件里,后缀是dwo。这个时候还不能使用symbol-file/file加载dwo文件。现在还没找到别的好办法。原创 2024-05-17 20:14:59 · 175 阅读 · 0 评论 -
Linux: binutils: dwp coredump __GI_fseek,
使用dwp查看clang编译出来的文件,会导致dwp产生coredump。下一步就是要看传递进来的fp为什么是0?原创 2024-05-11 08:08:51 · 78 阅读 · 0 评论 -
Coredump-X: envoy的一个修改 是否有产生coredump的危险
下面有一个参数可以控制,当列表为空的时候,判断是否要做local reply。那如果没有打开这个功能,而列表又为空,是不是会产生coredump?如果功能打开,可以返回local的reply。原创 2024-05-10 12:47:09 · 307 阅读 · 0 评论 -
gdb: clang生成的binary无法识别的一个例子
这个就是clang/clang++编译的时候使用了gdb无法识别,不兼容的选项。解决方法,是使用lldb来看coredump文件以及二进制文件。原创 2024-05-10 10:50:10 · 52 阅读 · 0 评论 -
coredump-x: sanitizer编译出现segmentfault
如果是使用多个sanitizer的功能,比如lsan,asan,ubsan同时使用的时候,就会出现这个错误。看着更像是这三个里面的符号可能有冲突,导致符号的地址出现异常。从上面两个链接,看着已经解决了,需要使用新版本的gcc。原创 2024-04-15 13:08:31 · 125 阅读 · 0 评论 -
Coredump-N: ksh strlen_avx2, 在需要audit同时没有/dev/pts/*的情况下发生coredump
这个问题已经在github上被改了。原创 2024-03-22 15:51:20 · 254 阅读 · 0 评论 -
Coredump-x: 如果只有coredump文件,怎么分析memory leak
如果leak的是一个string类型的数据结构,倒是可以使用strings命令来dump core文件里的内容。那只能靠dump代码里的所有数据结构,看看到底是哪一个leak的。这种其实没有什么好办法,如果可以模拟出来倒是可以很简单的解决。或者使用关键字查询代码,一个一个对比。而只有一个coredump文件。如果不是string类型的数据。原创 2024-03-17 16:54:04 · 97 阅读 · 0 评论 -
coredump-n: malloc-hook 里带printf
如果在malloc的hook函数里有打印输出,就会导致栈被占满的情况,因为会发送死循环。原创 2023-12-07 10:57:14 · 384 阅读 · 0 评论 -
Coredump-X: 假如delete/free一个栈上的变量Wfree-nonheap-object;Wmismatched-new-delete
因为这个栈上内存,没有经过malloc函数的赋型,导致后续free的时候,做检查的时候就通不过,会报错误:munmap_chunk(): invalid pointer。同时会出现SegV(gdb) bt(gdb) c(gdb) bt(gdb) f 5(gdb) p &a。原创 2023-11-14 20:41:55 · 126 阅读 · 0 评论 -
Redhat 环境下 gdb 使用的一般步骤
如果需要使用gdb看Redhat提供的共享库的function trace/backtrace,包括局部变量,全局变量,符号,就需要下载想要库的debuginfo包。另外一步,如果是对应看开源软件包的代码的话,需要从Redhat官网下载想要的源代码包,然后运行rpmbuild,将Redhat自己打的patch文件,apply到源代码上才能看对应的代码,不然行号都对不上。当然这个debuginfo的包是需要注册Redhat官网的用户来下载。所以这两个包,为使用Redhat提供了一定的障碍。原创 2023-11-14 07:45:29 · 117 阅读 · 0 评论 -
Coredump-N:fprintf第一个参数为空;同步问题
只有定义IO_DEBUG的时候,才会做这个null检查。如果没有定义,就不做null的check,就会出现coredump。这个导致的原因是两个线程同时使用到了这个stream,一个释放之后,另一个还在用。原创 2023-11-07 13:00:29 · 181 阅读 · 0 评论 -
gcc: O2编译选项 可以掩盖的一种coredump情况
有时候会决定将其删除。比如:析构函数里的对对象成员的赋值,因为对象都要被析构了,赋值没有意义,就会将赋值语句从实际的二进制文件里去掉。有些代码,如果选择O2选项的话,GCC会认为代码无用,或者根本不会产生任何数据上的变更,没有意义。而不带-O2选项的编译结果,可能会出现一种coredump。这个时候,如果赋值语句如果有问题,就会被O2选项给掩盖掉。原创 2023-10-30 13:44:35 · 153 阅读 · 0 评论 -
gdb: Warning Unable to find libthread_db matching inferior‘s thread library
最近遇到这个警告,这个警告的意思是说,调试的程序是多线程的程序,而且找到了libthread_db 和libc的目标文件,共享库,但是找不到符号:pthread_create。从下面的链接,可以看到以后libthread_db 的函数可能要合到libc里去,所以要添加对libc的兼容。就是对应的so文件中没找到符号,需要debuginfo相关的rpm安装。那为什么没找到相关的符号呢?原创 2023-10-26 18:54:29 · 982 阅读 · 0 评论 -
gdb:调试,程序莫名的跳动到程序的结尾; nexti的使用
假如这个宏函数里做了很多的事情,就有可能会被忽略,那能不能用step走进去呢?除非这个复杂逻辑里有其他函数调用,才能走进去,如果没有其他函数调用,step也说无用。昨天遇到一列gdb调试的问题,说,明明在程序的尾部做了一个标准输出的打印,但是使用gdb调试怎么都不能走到这一条语句。最后发现,是调试的粒度太大,不应该用next(是按C语言里的一条语句执行),而是应该用nexti:是按汇编指令一条条的调试。像这种莫名奇妙的现象,最可能学到新知识,因为只有当自己不知道此类知识的时候,才会感到莫名奇妙!原创 2023-10-24 07:56:13 · 161 阅读 · 0 评论 -
rpm: debug, debuginfo, devel; gdb
这个是在编译rpm包的时候,将build出来,带有符号,没有strip过的二进制文件打包到这个debuginfo rpm包里。使用debuginfo 包的时候,有依赖关系,需要安装很多依赖才能自动调用相应的debuginfo的文件。最好使用dnf命令来安装依赖。在发生coredump的时候,可以用来做调试,因为debuginfo里包含有二进制文件到源文件的映射信息。这种类型的devel是为开发者使用的,比如会包含静态连接库,头文件,接口信息等。所有相关的动态库的debuginfo 也都需要安装上去。原创 2022-07-15 22:14:03 · 607 阅读 · 0 评论 -
[晕事]今天做了件晕事25;进程莫名的重启
而且对于莫名其妙的死掉进程,首先要考虑的是:是否生成core文件。还可以使用strace命令查看有没有异常的signal。关于rlimit的设置。最终的原因是ulimit 默认的 core的size是0。在执行shell执行命令的时候默认的将这个ulimit值带到了新的进程,导致没有生产。今天遇到一个问题,进程不知道怎么死掉了,从/var/core,里没有coredump。为什么没有生产coredump文件呢,当时都晕了。所以一定要关注这个ulimit;原创 2023-10-20 13:31:49 · 75 阅读 · 0 评论 -
Coredump-n: 内存占用太多导致应用程序起不来的一例
前几天同事说写的代码编译到了程序之后,应用起不来,发现内存不够用。这种情况如何分析呢?确定哪一个区域使用的内存比较多。如果是堆,就需要使用调查内存的工具来做分析。如果自顶而下的分析法的话,还是比较容易做分析,但是要找到顶在哪里。看看是否有超大的全局变量,导致瞬间内存占满的情况。使用gcore来走一个core文件来分析。原创 2023-09-19 13:00:20 · 178 阅读 · 0 评论 -
coredump-n: Floating point exception;qemu;division by zero
这里有一例,除零出来的问题。这个产生的后果比较严重。原创 2023-09-13 14:33:07 · 109 阅读 · 0 评论 -
[晕事]今天做了件晕事20; 内核的function trace需要注意的一个点
其实他两个没有直接的联系,仅仅只是function trace在栈里的罗列关系。因为native_safe_halt,这个函数就是执行了halt指令。同时会允许中断进来。这才早就了这个显示。有时候会看到下面的这个function trace;这里需要注意的是从native_safe_halt到apic_timer_interrupt。原创 2023-09-11 14:50:04 · 115 阅读 · 0 评论 -
Coredump-X: 遇到一例单例模式,lazy-mode;多线程
这里instance是ABC里的一个静态私有变量,是一个指针;从设计上只有在需要的时候才做内存申请。但是遗漏了多线程的考虑,在多线程下instanc的访问会发生race condition,导致instance的内存申请发生多次,从而导致内存访问上的问题。解决方法,就是对instance做同步保护。或者不要使用lazy模式,一开始就申请内存。原创 2023-09-08 09:44:16 · 301 阅读 · 0 评论 -
汇编:lea 需要注意的一点
374d55: 48 8b 76 08 mov 0x8(%rsi),%rsi ,,,,卡在这一行,rsi当前值是0,374d31: 48 8d 46 28 lea 0x28(%rsi),%rax ,,,, 这里应该也会错。mov 0x8(%rsi),%rsi,而这个mov,在计算完地址,还要访问内存地址。lea 0x28(%rsi),%rax ,这个只是计算一个地址,而不是去做地址访问。原创 2023-09-07 13:00:27 · 651 阅读 · 0 评论 -
gdb: breakpoint: Command Lists:执行命令
可以在任何断点(或者是监测点watchpoint,或者是捕获点catchpoint)生效时,执行一串命令。例如:或许想在某一点处,打印特定变量的值,或者是打开另外一个断点。endend关键字,代表着命令集的结束。如果想删除断点关联的命令:type commands and follow it immediately with end。原创 2023-06-20 03:19:01 · 176 阅读 · 0 评论 -
gdb: 如果实时调试里的参数里有星号
如果在gdb里使用run命令,而且参数理由星号*,这时候需要注意要转义一下;另外一个办法是在执行gdb的时候,指定参数。–args,这个里可以有星号。而且在带到里面是有转义。原创 2023-06-13 12:35:26 · 65 阅读 · 0 评论 -
Coredump-N: func 1441 (discriminator 4);gdb是如何根据汇编地址找到行号的?
有时候在打印backtrace时,会遇到这个discriminator 4;这个是dwarf标准里定义的一个辨识器。如果是4,代表这一行代码还有别的信息在里面,就看gdb/gcc怎么使用解析这个辨识器。主要作用是为了方便优化器做分析使用。一条C可能出来多条汇编,这样在backtrace的时候,调试器也可以根据这些行号的对应信息来做解析。原创 2023-06-03 07:57:58 · 399 阅读 · 0 评论 -
Coredump-N: snprintf 参数带有非法字符串指针
2023-4-21, 遇到一例,snprintf 带进来的参数格式是%s,但是传递进来的指针地址是0x1;这样在调用strlen的时候就会出现Segv。原创 2023-04-21 15:39:43 · 255 阅读 · 4 评论 -
gdb: exec file is newer than core file
gdb 如果出现这个错误,就不要再看了;不能忽略的一个警告;因为这个时候gdb解释的基础是错误的,所以展示的也是错误的。需要再去找匹配的elf文件来做gdb;原创 2023-04-21 15:30:35 · 553 阅读 · 0 评论 -
Linux: crash: invalid kernel virtual address: ffffffffb54b75b0 type: “cpu_possible_mask“
假如使用了kernel-debug-debuginfo的vmlinux,去解kernel生成的vmcore文件,就会出现这个错误。–minimal这个选项可以让crash加载最小化的vmcore文件,当然就是有些命令的使用会受限制。详见:https://access.redhat.com/solutions/171713。kernel-debug和 kernel-debug-debuginfo是一对。这个错误出现的原因之一是vmlinux使用的版本不对。另一个是vmcore生成的有问题,不完整。原创 2023-03-29 20:08:01 · 344 阅读 · 0 评论 -
coredump-x: 整数溢出,潜意识要转变的一个例子
最近遇到一个stack被写坏的情况。栈数据被写坏之后,整个栈里的数据使用gdb就解不出来,导致分析困难。这种情况就需要使用栈里的原始数据手动分析,很麻烦。所以整数之间的加减法一定要在潜意识里考虑溢出的可能。除非可以非常确定不会发生这种情况。这里期望/假设index是大于等于1。这个期望和假设有时候是不对的。但是要看代码逻辑一定是大于等于1,如果不能确定就要加校验。最后发现原因是变量之间的加减法,没有考虑溢出的情况。原创 2023-03-29 03:13:06 · 48 阅读 · 0 评论 -
Linux: crash: unchecked MSR access error: WRMSR to 0x38d
这个好像说阿里云平台的问题导致。这个错误的意思是:对wrmsr写操作不安全,发生异常。从commit上看,就是为了增加调试以及修复bug的可能。在VMware TCI 2.2 创建的RHEL 8.7 VM;执行perf stat直接导致内核的crash;不知道是不是VMware已知的问题。从网上收到类似的问题。原创 2023-03-22 21:00:03 · 493 阅读 · 1 评论 -
Linux: crash: do not match;virsh dump;virsh inject-nmi domain; vmcore
可以确定的是找的linux的debug带符号的版本没有问题。没有版本不匹配的问题。而这个kdump是手动通过virsh dump所做的一个guest VM的core文件。当然这里需要注意,如果guest层所分配的内存如果很大的话,所产生的dump文件也会非常的大。不匹配错误:crash: ./usr/lib/debug/lib/modules/4.18.0-425.3.1.el8.x86_64/vmlinux and …从redhat相关的文档看会发现,在做virsh dump的时候可以指定一些参数;原创 2023-03-14 21:07:33 · 370 阅读 · 0 评论 -
gdb:在命令行中会莫名暂停;detach-on-fork
如果您选择“detach-on-fork=off”,则 gdb 将保留对所有子线程(包括嵌套子线程)的控制。您可以使用 info inferiors 命令列出 gdb 控制下的子进程,并使用 inferior 命令从一个子线程切换到另一个子线程。on 默认设置,gdb会放弃子线程(或者父线程,受follow-fork-mode的控制)的监控。off gdb会同时监控父线程及子线程。在调试一个线程的时候,另一个也会暂停。原创 2023-03-09 19:54:33 · 899 阅读 · 0 评论 -
Coredump-N: stack 空间被临时变量吃满,导致内存访问出现问题
0x080484f9 : sub $0x81f144,%esp 这里如果用。#define S 0x0019fd08UL 、、 乘5 等0x81F128。原创 2023-03-08 17:10:58 · 458 阅读 · 0 评论 -
Coredump-Z: 攻击类型的coredump/crash
这种碰到过几次;什么是攻击型的coredump呢?就是软件在正常跑,接收消息,处理消息;当然还是自身有问题导致。突然来了一个特殊的消息,某个字段值特别大,或者其他情况;而软件里在处理这个特大值时没有做合法性检查,导致访问越界。容易形成DOS攻击。如果从网上搜一下,会发现这种情况还很常见,有些kernel的bug,都有可能会导致服务器直接crash。原创 2023-03-05 18:24:01 · 119 阅读 · 0 评论 -
gdb: __exit_funcs‘ has unknown type; cast it to its declared type;data variable, no debug info
这个错误的意思是当前exit_funcs所属的类型未知,所以解释不了当前这个变量。没有debug info。这个错误的解决,需要下载相应的glibc-debuginfo 版本;目前RHEL看着已经不提供32位的下载了,但是centos还有。安装成功之后,再做dump,一切就正常了。原创 2023-03-01 14:09:07 · 703 阅读 · 0 评论 -
Coredump-N: 文件被篡改后,传输错误的一种结果
假如二进制可执行文件,在传输的过程中被人篡改,或者由于传输错误导致,里面的内容发生改变。也可能导致各种异常的行为。所以要看文件的checksum是否一致。下面这个案例是在main的函数里的一个字节发生了改变,导致push指令发改变,变成了cltd指令,就可能导致coredump。原创 2023-02-28 20:55:30 · 239 阅读 · 0 评论 -
Coredump-N: corrupted double-linked list
可以看到是这一行的调用。查看unlink_chunk函数的汇编,出现coredump时的地址是 817ab,这里可以通过寄存器esi的值算出来;这种没有什么好 的办法,只能通过加-g,使用Valgrind 调试程序,看看问题到底出现在哪里?从逻辑上看,就是双向链表出现了逻辑错误。也就是内存使用上有错误,溢出等。这里可以看出来,在做exit退出时出现了异常;另一种耗时的方法就是看代码,不可取。原创 2023-02-27 20:11:00 · 788 阅读 · 0 评论 -
Coredump-N: Program received signal SIGFPE, Arithmetic exception
2023-2-14, 遇到一例。这种出现的机率很低,除非在非常隐蔽的逻辑错误导致除数出现为0的情况。还是需要对照这个function backtrace和代码做问题分析。这里是算数运算出现异常。大多数情况是,做除法,但是除数是0.原创 2023-02-14 14:04:54 · 1082 阅读 · 0 评论 -
coredump-N: 主备两个VM同步数据导致
今天遇到一例是这样的,业务上有两个VM会启相同的程序;他们之间会有业务数据同步的需要。当一个VM的应用程序被替换到新的版本的时候,需要考虑同步数据的数据结构是否发生变更。而当前这一侧开始使用新的数据结构来解析这个同步数据的时候。就有可能发生任何可能的问题,不仅是coredump。如果另一侧发过来的数据是按照老的数据结构发送。这样就会出现一种情况。原创 2023-01-05 15:28:30 · 125 阅读 · 0 评论