coredump问题原理探究(Linux版)
debugeeker
曾在华为,商汤,腾讯呆过。个人公众号debugeeker
展开
-
《coredump问题原理探究》Linux x86版7.12节string coredump
看一个coredump:Program terminated with signal 11, Segmentation fault.#0 0x0090bb06 in __strlen_sse2_bsf () from /lib/libc.so.6Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.149.el...原创 2019-07-20 23:49:46 · 779 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版6.8节多继承coredump例子
下面看一个coredump的例子:(gdb) bt#0 0x08048662 in xuzhina_dump_c06_s5_ex_child::inheritFrom(char*, int) ()#1 0x08048609 in main ()先看一下xuzhina_dump_c06_s5_ex_child::inheritFrom的汇编:(gdb...原创 2015-02-16 21:25:44 · 1325 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版6.7节多继承
类的多继承大致可以分为两种情况.一种是无共同基类的.一种是有共同基类的.先看一下第一种情况: 1 #include <stdio.h> 2 class xuzhina_dump_c06_s5_mother 3 { 4 private: 5 int m_age; 6 int m_beauty; 7 ...原创 2015-02-08 09:58:20 · 1051 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版6.3节有成员变量的类coredump例子
在探究完类成员变量分布后,来定位一个coredump例子来实践一把:(gdb) bt#0 0x0804863c in xuzhina_dump_c06_s2_ex::print() ()#1 0x08048713 in main ()看一下xuzhina_dump_c06_s2_ex::print的汇编:(gdb) disassemble 0x08...原创 2015-01-13 21:57:02 · 1438 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版6.5节虚函数的coredump例子
在大型项目中,很容易出现版本不匹配的问题,其中导致的虚函数飘移的问题比较难解决。在这里,用一个例子来说明如何解决这种问题。建立三个源文件:testso.h,testso.cpp,xuzhina_dump_c6_s3_ex.cpp。testso.h的代码如下: 1 #ifndef __TESTSO_H__ 2 #define __TESTSO_H__ 3 ...原创 2015-01-19 00:06:00 · 2028 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版6.6节单继承
在C++里,类的多态是通过继承由虚函数来体现的。那么在单继承中,类的成员变量和虚函数的分布又是怎样的呢?看一下例子: 1 #include <stdio.h> 2 class xuzhina_dump_c06_s4_base 3 { 4 private: 5 int m_a; 6 public: 7 ...原创 2015-02-04 20:04:43 · 1096 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版6.4节虚函数
在上一节已经探究了类的成员变量的排列,现在看一下虚函数表和成员变量的排列及虚函数之间的排列.先看一个例子: 1 #include <stdio.h> 2 class xuzhina_dump_c06_s3 3 { 4 private: 5 int m_a; 6 public: 7 x...原创 2015-01-14 20:45:46 · 1333 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版6.2节C++风格数据结构内存布局之有成员变量的类
上面一节已经探究出this指针的辨别,由this指针就可以看到类的内容。在这里,就由this指针来看一下类的成员变量是如何排列。先看一个例子 1 #include <stdio.h> 2 class xuzhina_dump_c06_s2 3 { 4 private: 5 short m_c; 6 ...原创 2014-11-30 10:13:08 · 1412 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版5.9节C风格数据结构内存布局之联合体
在C语言中,联合体(union)有点像结构体那样,把不同类型的数据组织起来,但和结构体不大一样,在结构体各成员有各自的内存空间,一个结构体对象的总长度是各成员长度之和。而在联合体中,各成员共享一段内存空间,一个联合体对象的长度等于各成员中最长的长度。由上面描述可知,联合体应该具备多面性,即在汇编层面上,有时候会显示结构体的特征,或数组特征,或其它基本数据类型特征。先看一下例子:...原创 2014-11-22 17:00:41 · 1229 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版6.1节C++风格数据结构内存布局之无成员变量的类
在探究完C风格数据结构内存布局之后,接着探究C++风格数据结构内存布局。虽然最简单的类是没有任何成员变量和成员函数,但由于没什么意义,不值得探究。在这里,就先探究一下没有任何成员变量和虚函数,只有成员函数的类。先看一下例子: 1 #include <stdio.h> 2 class xuzhina_dump_c06_s1 3 { 4 p...原创 2014-11-25 21:22:27 · 1095 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版7.3节List对象
先看一下例子:1 #include <list> 2 3 int main() 4 { 5 std::list<int> lst; 6 7 lst.push_back( 0x12345678 ); 8 lst.push_front( 0xabcdef01 ); 9 lst.push_back( ...原创 2015-04-23 23:06:10 · 1323 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版7.1节vector对象
先看一下例子: 1 #include <vector> 2 3 int main() 4 { 5 std::vector<int> vec; 6 vec.push_back( 0xffeeffab ); 7 vec.push_back( 0xabcdef01 ); 8 vec.push_back( ...原创 2015-02-25 22:55:15 · 1373 阅读 · 1 评论 -
《coredump问题原理探究》Linux x86版7.10节set相关的iterator对象
看一下set的iterator.由于map和set的相似性,只要看set就可以了.1 #include <set> 2 3 void init( std::set<int>& set ) 4 { 5 for ( int i = 0; i < 0x10; i++ ) 6 { 7 set.ins...原创 2015-11-20 23:48:11 · 1910 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版7.11节string对象
在定位map coredump的那一节已经接触了string对象.在这里重温一下.看一个例子: 1 #include <string> 2 #include <stdio.h> 3 4 int main() 5 { 6 std::string str; 7 char* ptr = "hello world!"; ...原创 2015-11-24 22:51:02 · 2854 阅读 · 1 评论 -
《coredump问题原理探究》Linux x86版7.9节list相关的iterator对象
这一节,看一下list的iterator对象在内存的布局1 #include <list> 2 3 void init( std::list<int>& lst ) 4 { 5 for ( int i = 0; i < 0x10; i++ ) 6 { 7 lst.push_back( i )...原创 2015-07-13 23:03:29 · 2181 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版7.7节 set对象
看一下bits/stl_map和bits/stl_set可以看到map和set的定义如下:84 template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>, 85 typename _Alloc = std::allocator<std:...原创 2015-07-04 22:25:27 · 2273 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版7.8节vector相关的iterator对象
在前面看过了一个vectorcoredump的例子,接触了vector的iterator,可以知道vector的iterator只有一个成员_M_current指向vector某一个元素.先看一个例子:1 #include <vector> 2 3 void init( std::vector<int>& vec ) 4 { 5 ...原创 2015-07-09 20:06:19 · 2398 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版7.5节 Map对象
先看一个例子: 1 #include <map> 2 3 int main() 4 { 5 std::map<int,int> iMap; 6 7 iMap[5] = 6; 8 iMap[8] = 20; 9 iMap[2] = 80; 10 11 return...原创 2015-04-27 23:37:58 · 1395 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版7.6节 Map coredump例子
定位一个map相关的coredump来熟悉一下:Core was generated by `./xuzhina_dump_c07_s3_ex 5 / 6'.Program terminated with signal 11, Segmentation fault.#0 0x00000000 in ?? ()Missing separate debuginfos, use: d...原创 2015-04-29 23:32:24 · 2671 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版7.4节List coredump例子
看一个coredump例子:看一个coredump例子:Core was generated by `./xuzhina_dump_c07_s2_ex'.Program terminated with signal 11, Segmentation fault.#0 0x0285b9b7 in std::_List_node_base::hook(std::_List_node...原创 2015-04-25 23:22:31 · 1920 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版7.2节vector coredump例子
看一个coredump的例子:[xuzhina@localhost s1_ex]$ gdb xuzhina_dump_c07_s1_ex core.27776 GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6)Copyright (C) 2010 Free Software Foundation, Inc.License GPL...原创 2015-04-21 23:04:14 · 1882 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版5.6节C风格数据结构内存布局之复合类型构成的结构体
由于结构体是不同类型数据结构的集合,那么一个结构体的成员可以是基本数据类型,也可以是另外一个结构体类型。那么复合类型的结构体又有什么特征呢。先看一个例子: #include <stdio.h> struct xuzhina_dump_c05_s3_2_sub { char a; short b; }; struct xuzhina_...原创 2013-04-16 21:39:36 · 1779 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版5.8节C风格数据结构内存布局之结构体数组结构体coredump
上一节已经阐述完毕结构体的特征了,需要一个coredump例子:(gdb) bt#0 0x00000000 in ?? ()#1 0x080485a1 in result(xuzhina_dump_c05_s3_ex*, int) ()#2 0x080487f8 in main ()更多内容请关注微信公众号"debugeeker",链接https://mp.w...原创 2013-04-24 21:35:52 · 2202 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版4.2节函数的逆向之顺序结构
先看一下例子:#include <stdio.h>int main(){ int a = 0, b = 0, c = 0, d = 0; scanf( "%d,%d", &a,&b ); a += b; scanf( "%d", &c ); a += c; scanf( "%d", &...原创 2013-02-01 22:23:51 · 2487 阅读 · 1 评论 -
《coredump问题原理探究》Linux x86版3.3节栈布局之局部变量
在上一节已经探讨了空函数时的栈布局,那么,在程序运行时,会有一些局部变量,那么它们是存放在栈哪里?在这里,继续探究一下当函数有局部变量时栈是怎样布局的。剩余内容请关注公众号"debugeeker"。链接为https://mp.weixin.qq.com/s/OUuWJ13FOU8VX95EoIlIvQ...原创 2013-01-17 19:31:14 · 3817 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版3.2节栈布局之函数桢
看一个例子:void FuncA(){}void FuncB(){ FuncA();}int main(){ FuncB(); return 0;}用下面命令编译出它发布版本:[buckxu@xuzhina 1]$ g++ -o xuzhina_dump_c3_s1_relxuzhina_dum...原创 2013-01-15 20:06:50 · 6772 阅读 · 3 评论 -
《coredump问题原理探究》Linux x86版第二章coredump捕获的环境配置
本文已经搬迁,敬请关注公众号"debugeeker"。文章链接为https://mp.weixin.qq.com/s/wHyn0LDvqIEOjKyIflHFjA原创 2013-01-11 19:26:44 · 8884 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版4.1节函数的逆向之序言
在产品的生命周期中,会遇到各种coredump,如果在调试版本出现coredump,定位它是非常简单的事情,因为从栈就可以知道是哪一行代码出现了问题。如:(gdb) bt#0 0x4365b569 in vfprintf () from /lib/libc.so.6#1 0x436629ff in printf () from /lib/libc.so.6#2 0x0804...原创 2013-01-30 21:53:01 · 2810 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版3.8节栈布局之栈溢出coredump例子
现在,回到前言的栈,看一下能不能用上面的规律来恢复它的栈。前言的可执行文件是没有使用-fomit-frame-pointer编译选项的。前言的栈是这样的:(gdb) bt#0 0x6f745374 in ?? ()#1 0x57735571 in ?? ()#2 0xbff80065 in ?? ()Backtrace stopped: previous frame inne原创 2013-01-28 20:45:46 · 5429 阅读 · 1 评论 -
《coredump问题原理探究》Linux x86版3.1节栈布局之概述
在定位core dump问题,看栈是必要的一步。因为栈是反映了程序崩溃那一瞬间的情况,包括函数调用关系,参数,局部变量。要找出程序崩溃的地方,必须以栈为依据。而在开发过程中,一般会有调试版本和发布版本,其中调试版本会包含很多符号信息便于调试,而发布版本往往为了商业秘密的保护,在产品发布时去掉了调试信息。这两种方式会导致栈在可读性上不一样。剩余内容请关注公众号"debugeeker",链接为h...原创 2013-01-13 20:17:21 · 4938 阅读 · 1 评论 -
《coredump问题原理探究》Linux x86版3.7节栈布局之返回值
虽然在x86里,返回值并不是通过栈来传递。但返回值也是调用约定的一个知识点。而且,对于函数来说,有入应该有出,入就是参数,出就是返回值。但返回值有什么特征呢?看一下例子:int funcA(){ return 1;} int funcB(){ return 2;} int main(){ return f...原创 2013-01-26 19:39:02 · 2653 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版第一章前言
本文已经迁移到公众号“debugeeker"。请点击下列链接观看https://mp.weixin.qq.com/s/v5GyYnGUfQLp-F96cflxiA原创 2013-01-09 19:48:23 · 7531 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版3.4节栈布局之函数参数
上面已经讨论当有局部变量空参数的函数时栈的布局,那么当函数具有局部变量和参数,那么栈布局又会怎样?先看一个例子:int func( int c, char* s, int off ){ int a = 0x12345678; int *p = &a; int res = c + *( s + off ); return *p + res...原创 2013-01-19 20:54:22 · 4915 阅读 · 2 评论 -
《coredump问题原理探究》Linux x86版3.5节栈布局之-fomit-frame-pointer编译选项
上面探讨了没有使用-fomit-frame-pointer编译选项的程序的栈桢规律,那么如果一个程序是通过-fomit-frame-pointer编译选项来编译,它运行时的栈桢规律有没有可能不同呢?先看一个例子:int func( int num ){ int result = num*num; result += num - 1; return r...原创 2013-01-21 20:16:32 · 3776 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版5.7节C风格数据结构内存布局之结构体数组
在探究过数组和结构体这两种非原生的数据类型之后,可能会想知道这两种类型结合成结构体数组,会有什么特征。先看一个例子: #include <stdlib.h> struct xuzhina_dump_c05_s3_3 { short idx; int sq; }; void init( struct xuzhina_dump...原创 2013-04-22 21:35:29 · 1836 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版5.4节C风格数据结构内存布局之数组coredump例子
试定位一个coredump的例子来验证一下。堆栈:(gdb) bt#0 0x43756109 in __memset_sse2 () from /lib/libc.so.6#1 0x08048643 in main ()更多内容请关注微信公众号"debugeeker",链接https://mp.weixin.qq.com/s/qpHPqTb79dvTsi_V4...原创 2013-03-21 23:30:21 · 3715 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版5.5节C风格数据结构内存布局之基本数据类型构成的结构体
在C语言里,结构体是不同类型数据结构的集合。由于结构体比较复杂,分为几种情况来讨论:1.成员全是由基本数据类型构成2.成员有基本数据类型,也有其它结构体构成,构成成员的结构体是1,2两种情况。3.结构体构成的数组这一节先讨论第一种情况.要了解这种类型结构体的内存布局,首先要知道成员在内存里是如何排序,及各个成员在内存占的大小。先看一个例子 #include <...原创 2013-03-31 20:41:13 · 1970 阅读 · 0 评论 -
《coredump问题原理探究》Linux x86版5.3节C风格数据结构内存布局之数组
在C语言里,数组就是相同类型变量的集合体。由这个定义,可大致得知数组的特征:1.有首元素。而首元素的地址和数组地址一样,即有基地址2.每个元素的大小是一样的。那么每个元素相对基地址的偏移值应该是元素大小和索引值的乘积。也就是说,基地址和与索引值成比例的偏移值有可能是数组的特征。还是按照上面的方式来逐个对各类型的数组进行探究。先看一下char型的数组 #include...原创 2013-03-14 21:24:40 · 2110 阅读 · 1 评论 -
《coredump问题原理探究》Linux x86版5.2节C风格数据结构内存布局之基本数据类型
在C语言中,基本的数据类型无非是char, short, int,long, float, double及相应的指针。那么它们在内存里是怎样存放的,在汇编指令里显示怎么样的特征呢?在这里就分别来探究一下char, short, int, long, float, double的特征。先用一个例子来看一下char的特征: #include <stdio.h> int m...原创 2013-03-11 20:44:24 · 2506 阅读 · 1 评论 -
《coredump问题原理探究》Linux x86版5.1节C风格数据结构内存布局之引言
在定位coredump位置,过程无非是找到哪一行代码出现,哪个变量,参数或元素出现问题.。在第四章,已经探讨了函数的逆向。通过逆向出问题的函数,可以根据出错的指令定位到哪一行代码。但这还远远不够,因为在很多情况必须要知道是哪个数据出问题。在很多情况下,如:int result = insertSql( userSession->db->table, userSessio...原创 2013-02-25 22:06:40 · 1936 阅读 · 0 评论