免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1777 | 回复: 4
打印 上一主题 下一主题

[内存管理] libdwarf [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-05 13:22 |只看该作者 |倒序浏览
/*******************************************************************************
  *函数名称:static void get_loc_list(Dwarf_Debug dbg, Dwarf_Die die, struct sub *sub)
  *函数功能:解析一个函数类型die的下挂的寄存器偏移信息,保存到sub->loc链表中
  *输入参数:
        @Dwarf_Debug dbg:libdwarf库的总数据结构
        @Dwarf_Die die:需要被解析的一个函数类型die
        @struct sub *sub:函数DIE对应的信息块指针
  *输出参数:无
  *函数返回值:无
  *其他:dwarf_ 开头的函数都是libdwarf库提供的函数
*******************************************************************************/
static void get_loc_list(Dwarf_Debug dbg, Dwarf_Die die, struct sub *sub)
{
        Dwarf_Unsigned offset=0;
        Dwarf_Error error = 0;
        Dwarf_Addr hipc_off;
        Dwarf_Addr lopc_off;
        Dwarf_Ptr data;
        Dwarf_Unsigned entry_len;
        Dwarf_Error err;
        int res;
        Dwarf_Unsigned next_entry;
        Dwarf_Attribute t_attr;
        struct loc *tmp=NULL,*pos;

        res = dwarf_attr(die, DW_AT_frame_base, &t_attr, &error);//使用libdwarf库解析条目属性
        if (res == DW_DLV_OK)
        {
                res = dwarf_formudata(t_attr, &offset, &error);//使用libdwarf库获取属性对应的条目链
                if (res == DW_DLV_OK)
                        for(;
                                {
                                        res = dwarf_get_loclist_entry(dbg,offset,&hipc_off,&lopc_off,&data,&entry_len,&next_entry,&err);//遍历所有条目
                                        if (res == DW_DLV_OK)
                                        {//每成功取出一个条目
                                                if(entry_len == 0 )
                                                        break;
                                                if(entry_len > 1 )
                                                {
                                                tmp = (struct loc*) malloc(sizeof(struct loc));//申请内存
                                                if(tmp)
                                                {
                                                        memset(tmp,0,sizeof(struct loc));
                                                        tmp ->begin = cu_low_pc + lopc_off;
                                                        tmp ->end = cu_low_pc + hipc_off;
                                                        tmp ->reg = (unsigned short)*(char*)data;//保存条目信息
                                                        if(entry_len == 2)
                                                                tmp ->base = (unsigned short)*(char *)(data+1);
                                                        else
                                                                tmp ->base = (unsigned short)*(unsigned short *)(data+1);
                                                        if(sub->loc)
                                                        {
                                                                pos = sub->loc;//加入当前处理的函数的loc链表中
                                                                while(pos->next)
                                                                        pos = pos->next;
                                                                pos->next = tmp;
                                                        }
                                                        else
                                                                sub->loc = tmp;
                                                }
                                                else break;
                                                }
                                                offset = next_entry;
                                                continue;
                                        }
                                        else break;
                                }
        }
},
我的问题是res = dwarf_get_loclist_entry(dbg,offset,&hipc_off,&lopc_off,&data,&entry_len,&next_entry,&err);的个参数的含义这里条目的具体含义。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
2 [报告]
发表于 2016-05-05 21:37 |只看该作者
    if(entry_len == 2)
                                                                tmp ->base = (unsigned short)*(char *)(data+1);
                                                        else
                                                                tmp ->base = (unsigned short)*(unsigned short *)(data+1);
这句话是啥意思?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
3 [报告]
发表于 2016-05-06 15:41 |只看该作者
本帖最后由 nswcfd 于 2016-05-06 17:11 编辑

---不好意思,请忽略此回复---

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2016-05-06 17:15 |只看该作者

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-03 06:20:00
5 [报告]
发表于 2016-05-07 20:28 |只看该作者
谢谢。现在我已经知道我用的部分的使用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP