dwarf格式解析

Posted honpey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dwarf格式解析相关的知识,希望对你有一定的参考价值。

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);

}   

 

以上是关于dwarf格式解析的主要内容,如果未能解决你的问题,请参考以下文章

DWARF格式和CFI指令

DWARF格式和CFI指令

DWARF格式和CFI指令

gcc默认使用的是dwarf格式

即使构建设置具有调试信息格式 = 带有 dSYM 的 Dwarf,Xcode 也不会生成所有必需的 dSYM

为 Blogger 上的博客格式化代码片段 [关闭]