debug_line中包含的是地址和源文件行之间的关系

我今天想搞清楚的是文件的C代码和汇编代码之间的关系:

对这块之前一直是迷迷糊糊的,发现这个问题已经严重影响到bug的定位了.

之前感觉C和汇编不能一一对应起来,但是太模糊了! 什么叫做不能一一对应,到底是C能对应到某一部分的汇编,还是汇编能对应到某一部分的C,能不能说得清楚一些?

希望看到的一种现象是: 能够从dwarf中看到, 说这部分汇编代码就是对应的C语言中的第几行到第几行!~

addr2line的貌似可以解答我的疑惑.

addr2line输入一个虚拟地址,然后addr2line会根据这个地址报告我说这个地址对应的虚拟地址是多少

[疑惑: 对于inline的函数会怎么处理呢?]

具体用法:

an accurate picture of the source program

x29在arm64中是栈帧寄存器

发现栈帧中根本就没有!

arm64的ret指令是会改变寄存器的

b和ret,跳转指令会改变寄存器,ret指令也会改变寄存器. 但是改变的都是x30寄存器吧? 还包括状态寄存器!

可能CPU会

arm64的处理规范是:caller把所有的变量给准备好,按照x0到x7的方式准备好[],如果超过8个参数,会把参数放到堆栈中去,那个一个栈帧到底是指什么?

下面这段代码用来考察arm64的栈帧:(该代码很简单,但是包含了传参的复杂场景,包括形参多于8个,此时会涉及到寄存器不够用的情况.并且涉及到返回值很大)

stp x29,x30,[sp, 0x8]!
先修改寄存器的值, 再做
#include <stdio.h>
#include <string.h>
#include <stdlib.h> struct big{
char buf[64];
int i;
};
int func(int a, int b, int c, int d, int e,
int f, int g, int h, int i, int j) {
return a+b+c+d+e+f+g+h+i+j;
}
struct big funb() {
struct big big_buf;
big_buf.i = func(1,2,3,4,5,6,7,8,9,10);
return big_buf;
}
int funa(int a)
{
return a+1;
}
int fun(int a)
{
int b, c;
b = a+2;
c = funa(1);
return a+b+c;
}
int main()
{
int i;
struct big big_buf;
big_buf = funb();
i = big_buf.i;
return fun(i); }

debug_line中的信息, 一脸蒙.这个段说是C与汇编的对应, 但是根本就没看出来呀!

Raw dump of debug contents of section .debug_line:

  Offset:                      0x0
长度: 62
DWARF 版本: 2
Prologue Length: 29
最小指令长度: 1
“is_stmt”的初始值: 1
Line Base: -5
Line Range: 14
Opcode Base: 13 Opcodes:
Opcode 1 has 0 args
Opcode 2 has 1 args
Opcode 3 has 1 args
Opcode 4 has 1 args
Opcode 5 has 1 args
Opcode 6 has 0 args
Opcode 7 has 0 args
Opcode 8 has 0 args
Opcode 9 has 1 args
Opcode 10 has 0 args
Opcode 11 has 0 args
Opcode 12 has 1 args
目录表为空。 The File Name Table (offset 0x1c):
条目 目录 时间 大小 名称
1 0 0 0 test.c Line Number Statements:
[0x00000027] Extended opcode 2: set Address to 0x4004f6
[0x00000032] Special opcode 10: advance Address by 0 to 0x4004f6 and Line by 5 to 6
[0x00000033] Special opcode 104: advance Address by 7 to 0x4004fd and Line by 1 to 7
[0x00000034] Special opcode 90: advance Address by 6 to 0x400503 and Line by 1 to 8
[0x00000035] Special opcode 35: advance Address by 2 to 0x400505 and Line by 2 to 10
[0x00000036] Special opcode 161: advance Address by 11 to 0x400510 and Line by 2 to 12
[0x00000037] Special opcode 132: advance Address by 9 to 0x400519 and Line by 1 to 13
[0x00000038] Special opcode 188: advance Address by 13 to 0x400526 and Line by 1 to 14
[0x00000039] Special opcode 188: advance Address by 13 to 0x400533 and Line by 1 to 15
[0x0000003a] Special opcode 35: advance Address by 2 to 0x400535 and Line by 2 to 17
[0x0000003b] Special opcode 119: advance Address by 8 to 0x40053d and Line by 2 to 19
[0x0000003c] Special opcode 147: advance Address by 10 to 0x400547 and Line by 2 to 21
[0x0000003d] Advance PC by 2 to 0x400549
[0x0000003f] Extended opcode 1: 序列结束

dwarf 只记录整个汇编代码中最关机的部分,

什么是最关键的部分呢? 其实汇编代码大部分和C代码是无关的,比如说寄存器现场的保存, 变量的读取等, 都不是最核心的代码, 什么是最核心的代码?

核心的代码是要能和C语言对应起来的代码! 想想dwarf的出现真是牛逼!

因为dwarf能从另一个角度看C代码: 变量的声明与定义这个与我们平常定位问题是无关的, 所谓的汇编与C对应, 其实就是可执行代码!

可执行代码包括:赋值与计算! 应该就这么两类了!(突然感觉层次好高~~~)

那么这里就涉及到一个难题, 通常C代码的一行可能对应着汇编代码的多行,这个在dwarf中是怎么处理的?

突然感觉dwarf做了一件很人工智能的事情, 意义不亚于谷歌翻译!

从汇编到C语言代码段的翻译,不简单!

如果类比成谷歌翻译, 那么就是概率性的问题了, dwarf翻译出来的结果也是概率性的吗?

发现这样一个规律 debug_line中只针对这样几处C代码:

1) 是计算的部分; 2)函数头函数尾 |||  也就是过滤掉了变量的声明的部分! 真是一个天大的发现

可以好好研究一下dwarf翻译的算法:

dwarf格式解析的更多相关文章

  1. plist文件、NSUserDefault 对文件进行存储的类、json格式解析

    ========================== 文件操作 ========================== Δ一 .plist文件 .plist文件是一个属性字典数组的一个文件: .plis ...

  2. MySQL binlog的格式解析

    我搜集到了一些资料,对理解代码比较有帮助. 在头文件中binlog_event.h中,有描述 class Log_event_header class Log_event_footer 参见[Myst ...

  3. JSON格式解析和libjson使用简介(关于cjson的使用示例)

    JSON格式解析和libjson使用简介 在阅读本文之前,请先阅读下<Rss Reader实例开发之系统设计>一文. Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据 ...

  4. 转:YUV RGB 常见视频格式解析

    转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...

  5. TS格式解析

    1.TS格式介绍 TS:全称为MPEG2-TS.TS即"Transport Stream"的缩写.它是分包发送的,每一个包长为188字节(还有192和204个字节的包).包的结构为 ...

  6. 虚拟机VHD格式解析到NTFS文件系统解析

    本来的需求是XEN下的镜像取证,但这篇仅包括他支持的一种格式,就是VHD,此项目从头开始大概用了两周时间,中间遇到了很多让人头大的问题,光是思考的笔记就写了十几页纸,不过实际上并没有那么难,主要是很久 ...

  7. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  8. POI使用:用poi接口不区分xls/xlsx格式解析Excel文档(41种日期格式解析方法,5种公式结果类型解析方法,3种常用数值类型精度控制办法)

    一.使用poi解析excel文档 注:全部采用poi接口进行解析,不需要区分xls.xlsx格式,不需要判断文档类型. poi中的日期格式判断仅支持欧美日期习惯,对国内的日期格式并不支持判断,怎么办? ...

  9. YUV420格式解析

    一般的的YUV420图像格式实际上是Y'UV,420指的是其在Y U V上面的采样率.在YUV420的格式中,首先存储每一个像素的Y'值,然后跟着存储的是每2*2方阵采样一次的U值,最后存储的是每2* ...

随机推荐

  1. 8、ASP.NET MVC入门到精通——View(视图)

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 View视图职责是向用户提供界面.负责根据提供的模型数据,生成准备提供给用户的格式界面. 支持多种视图引擎(Razor和ASPX视图引擎是官 ...

  2. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  3. 走进 .Net 单元测试

    走进 .Net 单元测试 Intro "不会写单元测试的程序员不是合格的程序员,不写单元测试的程序员不是优秀程序员." -- 一只想要成为一个优秀程序员的渣逼程序猿. 那么问题来了 ...

  4. ArcGIS10.2.2 Desktop直接连接数据库的具体步骤

    ArcGIS10.2.2 Desktop直接连接数据库的具体步骤,以sqlserver2008R2和oracle11G数据库为例子,这里数据库的具体安装步骤不说了,不在讨论的范畴之内. 假如数据库软件 ...

  5. SharePoint 2013 母版页取消和HTML页关联

    前言:在新版本的SharePoint 2013上,有新的功能可以通过HTML导入母版页,然后HTML和Master页面相关联,更改HTML页的时候,Master会自动同步修改,然而,有些时候我们不需要 ...

  6. Google C++单元测试框架GoogleTest---TestFixture使用

    一.测试夹具(Test Fixtures):对多个测试使用相同的数据配置 如果你发现自己写了两个或更多的测试来操作类似的数据,你可以使用测试夹具.它允许您为几个不同的测试重复使用相同的对象配置. 要创 ...

  7. iOS---用Application Loader 上传的时候报错No suitable application records were found. Verify your bundle identifier 'xx' is correct

    用Application Loader 上传的时候报错,突然发现用Application Loader的账号 竟然不是公司的账号  换成公司的账号 就可以了.

  8. JDBC快速入门

    /** * JDBC快速入门: * 1.导入jar包 数据库驱动 * 2.注册驱动 * 3.获取数据库连接对象 Connection * 4.定义sql语句 * 5.获取发送执行sql语句的对象 St ...

  9. 初学RunLoop

    RunLoop 运行循环,跑圈 可以看出每条线程都有一个与之对应的RunLoop对象 主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建. 基本作用:保持程序的持续运行 处理A ...

  10. CSS3-06 样式 5

    浮动(Float) 关于浮动,要说的可能就是:一个设置了浮动的元素会尽量向左移动或向右移动,且会对其后的元素造成影响,其后的元素会排列在其围绕在其左下或右下部.似乎就这么简单,但是在实际开发中,它应用 ...