游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2066|回复: 3

有关C++栈回溯的问题。。。。。。。。。

[复制链接]

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
发表于 2013-1-10 11:23:05 | 显示全部楼层 |阅读模式
本帖最后由 cndv3996 于 2013-1-10 11:24 编辑

各位,请教。。。。。。。。。。。。

我在C++代码中进行栈回溯,本身是很容易的,

我怎样能判断回溯到的调用是全局的new这个操作符。

在win32下,new最终应该会调用HeapAlloc这个win32 api。

如果我hook上HeapAlloc,进行栈回溯,

怎样能确定,回溯到特定进程的new,并进行统计?

c++的new好像是存于一个C++动态运行库中。

any ideas?

11

主题

95

帖子

658

积分

高级会员

Rank: 4

积分
658
发表于 2013-1-10 13:25:49 | 显示全部楼层
你可以用动态链接库HOOK全部的进程,把要统计的进程ID给动态链接库。GetCurrentProcessId()来比对,假如是本进程,那么对统计数加一。  当然这些统计要在你jmp到的函数里执行,你应该使用替换HeapAlloc的前几个字节为jmp的吧。

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
 楼主| 发表于 2013-1-10 20:25:30 | 显示全部楼层
谢楼上提醒,

除了跳转,定位进程,还要判断哪里的caller是new操作符。。。。。。

初步的想法是,

new好像是存在于msvcrt.dll中,
遍历这个dll,找到new的起始地址,结束地址,

那么栈中回溯到位于2者之间的地址,就是new了。。。。。。

估计是这样。。。。。。

11

主题

95

帖子

658

积分

高级会员

Rank: 4

积分
658
发表于 2013-1-10 22:02:04 | 显示全部楼层
new不是系统给你的函数吧 而是编译器给你生成或者你重载在new运算符。   因为一般new操作是用HeapAlloc申请对象空间,然后再调用对象的构造函数     所以不同类所调用的new应该是不同的吧  
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-14 01:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表