首页
社区
课程
招聘
[讨论][讨论]关于获取callstack
发表于: 2010-7-16 20:35 6080

[讨论][讨论]关于获取callstack

2010-7-16 20:35
6080
看到过codeproject上有人的stackwarker, 需要调用dbghlp.dll

来获得callstack信息,

现在自己有个想法,希望有过相应经验的兄弟指点一二:
     1). 应用环境是在c++中 并且 callstack信息不需要完全精确
   
所以我的想法是
   2). 在触发需要获得callstack的场景下,调用一个内嵌汇编的函数:
      该函数通过ebp回溯eip, 然后根据eip比对函数地址大致确定函数名。
因为不需要十分精确,所以大致上认为该方案有一定的可行性

想法是将代表函数调用的eip纪录下来,事后生成callstack
所以现在的问题是:
    1).  如何将eip换算成在模块内的偏移,然后根据该偏移确定是哪个函数
   2). 如果 1) 无可行性, 想最本的方法,记录所有函数地址,然后比对,确定callstack
         有什么方便的方法获取函数地址么

还有如何获得callstack基地址, 是固定的么?
由于我的kx都用来买邀请码了,就不讲该贴列为悬赏贴了
希望各位大神不吝赐教

谢谢

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
windbg的栈回溯功能就不错~~
有EIP很容易确定是在哪个模块,然后再根据这个模块的符号来确定是哪个函数内部。。。
2010-7-16 22:52
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了
2010-7-17 08:02
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
因为想把eip纪录下来(可能存储在文件里,然后事后分析)
所以特别想知道这个eip如何换算成对应模块的偏移
windbg支持通过该参数确定函数名么?

谢谢
2010-7-17 08:09
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
先获取所有已加载模块的基址和映像大小,然后看EIP落在哪个模块的地址范围内。。。
然后EIP-ModuleBase不就是偏移了嘛。。。
2010-7-17 19:48
0
雪    币: 209
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如果是为了事后分析,发生未处理异常的时候生成dump文件不就可以了么
2010-7-19 18:49
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
不是为了定位异常, 有其他目的,
比如纪录某个内存分配函数的执行路径,便于定位内存泄露, 这样显然不能靠dump memory实现了
2010-7-20 09:28
0
雪    币: 209
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
找内存泄露还是用LeakDiag吧,省事多了
2010-7-20 20:30
0
游客
登录 | 注册 方可回帖
返回
//