coredump之构造函数分析

本文主要是学习coredump中构造函数的分析主要分析以下两点

  1. 反编译的构造函数;
  2. 汇编中构造函数的内存结构

 

                                                                                                                 

随便写一个类,使用的g++ -g -o  this.cpp mythis

#include <stdio.h>
class xuzhia_dump_c06_s2
{
  private:
    short m_c;
    char m_d;
    int m_e;
  public:
     xuzhia_dump_c06_s2(int a,int b){
      m_c = (short)(a+b);
      m_d = 'd';
      m_e = a -b;
    }
  void print(){
    printf("mem %d,%c,%d\n",m_c,m_d,m_e);
  }
};
int main(){
    xuzhia_dump_c06_s2 test(2,3);
    test.print();
    return 0;
}

  生成一个mythis

 

gdb 跑起来先反编译main:

(gdb) disassemble main
Dump of assembler code for function main():
   0x0000000000400596 <+0>:	push   %rbp
   0x0000000000400597 <+1>:	mov    %rsp,%rbp
   0x000000000040059a <+4>:	sub    $0x10,%rsp
   0x000000000040059e <+8>:	mov    %fs:0x28,%rax
   0x00000000004005a7 <+17>:	mov    %rax,-0x8(%rbp)
   0x00000000004005ab <+21>:	xor    %eax,%eax
   0x00000000004005ad <+23>:	lea    -0x10(%rbp),%rax
   0x00000000004005b1 <+27>:	mov    $0x3,%edx//参数1
   0x00000000004005b6 <+32>:	mov    $0x2,%esi//参数2
   0x00000000004005bb <+37>:	mov    %rax,%rdi//参赛3
   0x00000000004005be <+40>:	callq  0x4005ea <xuzhia_dump_c06_s2::xuzhia_dump_c06_s2(int, int)>
   0x00000000004005c3 <+45>:	lea    -0x10(%rbp),%rax
   0x00000000004005c7 <+49>:	mov    %rax,%rdi
   0x00000000004005ca <+52>:	callq  0x400626 <xuzhia_dump_c06_s2::print()>
   0x00000000004005cf <+57>:	mov    $0x0,%eax
   0x00000000004005d4 <+62>:	mov    -0x8(%rbp),%rcx
   0x00000000004005d8 <+66>:	xor    %fs:0x28,%rcx
   0x00000000004005e1 <+75>:	je     0x4005e8 <main()+82>
   0x00000000004005e3 <+77>:	callq  0x400460 <__stack_chk_fail@plt>
   0x00000000004005e8 <+82>:	leaveq 

这里要说下参数3,根据协议参数1和参数2比较好理解,但参数3是什么,参数3就是this指针,大家知道在c++构造函数中会有一个默认的参数this,就是这个,而在协议中rax这个寄存器是存放返回值的。在接着看汇编,下面做的事情是调用构造函数,结合简单的汇编可以得出在汇编的构造函数中会将构造函数的结果保存在rax中,这个rax就是this指针。

在来看下构造函数里面变量的内存结构

在对应的地方打点

(gdb) b 19
Breakpoint 1 at 0x4005ad: file this.cpp, line 19.
(gdb) b 20
Breakpoint 2 at 0x4005c3: file this.cpp, line 20.
(gdb) b main+45
Function "main+45" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 3 (main+45) pending.
(gdb) run
Starting program: /home/open/vm/coredump/mythis 

Breakpoint 1, main () at this.cpp:19
19	    xuzhia_dump_c06_s2 test(2,3);
(gdb) n

Breakpoint 2, main () at this.cpp:20
20	    test.print();

在运行到20时候即构造函数构造完成之后看下rax里面的值

(gdb) info registers 
rax            0x7fffffffdd00	140737488346368
rbx            0x0	0
rcx            0x0	0
rdx            0xffffffff	4294967295
rsi            0x2	2
rdi            0x7fffffffdd00	140737488346368
rbp            0x7fffffffdd10	0x7fffffffdd10

打印下rax里面的地址值

(gdb) x/3uh 0x7fffffffdd00
0x7fffffffdd00:	5	65380	65535

可以看到构造函数里面的内存结构,这个和 5 'd' -1对应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你想了解如何分析coredump文件。coredump文件是在程序崩溃或异常终止时生成的,其中包含了程序在崩溃时的内存状态。这些文件对于调试和定位问题非常有用。要分析coredump文件,你可以按照以下步骤进行操作: 1. 确认操作系统和编译器版本:确保你使用的操作系统和编译器版本与生成coredump文件的程序相匹配。不同的操作系统和编译器可能有不同的调试工具和命令。 2. 安装调试工具:根据你的操作系统,安装相应的调试工具。例如,对于Linux系统,常用的调试工具包括GDB(GNU Debugger)和LLDB(LLVM Debugger)。 3. 使用调试工具打开coredump文件:使用所选的调试工具打开coredump文件。可以使用以下命令:`gdb <可执行文件路径> <coredump文件路径>`或`lldb <可执行文件路径> -c <coredump文件路径>`。 4. 分析崩溃信息:一旦你成功打开了coredump文件,调试工具会提供崩溃时的堆栈跟踪信息。这些信息可以告诉你程序崩溃的位置和可能的原因。 5. 查看变量和内存状态:使用调试工具的命令来查看变量的值和内存的状态。你可以使用命令如`print <变量名>`来打印变量的值,或使用`x/<长度><格式> <内存地址>`来查看特定内存地址的内容。 6. 调试和定位问题:通过逐步执行代码、设置断点、打印变量值等方法,来进一步调试和定位问题。这可能需要对调试工具的命令和功能有一定了解。 请注意,coredump文件可能包含敏感信息,因此在分析之前,请确保你对文件的使用有适当的权限和安全措施。此外,分析coredump文件可能需要一定的经验和技能,特别是对于复杂的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值