首页
社区
课程
招聘
求助,怎么定位具体是CString是哪个变量引起的崩溃
2024-4-11 11:22 2110

求助,怎么定位具体是CString是哪个变量引起的崩溃

2024-4-11 11:22
2110

1
2
3
4
5
6
7
8
9
void Release() throw()
{
    ATLASSERT( nRefs != 0 );
 
    if( _InterlockedDecrement( &nRefs ) <= 0 )
    {
        pStringMgr->Free( this ); 崩溃点在这
    }
}

但是我这个大长函数中有个几百个CString的变量,怎么判断或者定位是哪个变量引起的呢?

他这个崩溃点是这个大长函数的结尾,析构局部变量的时候引起的。
会不会是因为,全局的CString赋值给局部的CString,局部变量析构的时候,引用计数不对了呢?


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2024-4-18 10:57 被xxos编辑 ,原因: 有2个字打错了
收藏
点赞0
打赏
分享
最新回复 (18)
雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-11 11:28
2
0
               ATLASSERT( nRefs != 0 );
这个nRefs  的值每次都不一样  有时候是-1  有时候是负的特别大的值~
雪    币: 5941
活跃值: (2577)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MSGG05 2024-4-11 11:32
3
0
赋值是复制一份字符串而非引用计数的增加,不存在引用计数不对的问题。
雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-11 13:10
4
0
MSGG05 赋值是复制一份字符串而非引用计数的增加,不存在引用计数不对的问题。
nRefs 有时候是-1  有时候是一个负值特别大的值 有可能是-2712 也有可能是-365656564,这种的话,是引用计数的问题吧?
雪    币: 205
活跃值: (2599)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
yeyeshun 2 2024-4-11 14:53
5
0
更大概率是局部变量被踩踏了
雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-11 16:26
6
0
yeyeshun 更大概率是局部变量被踩踏了
我发现nRefs崩溃的时候有3个种值 一个是-1  另外一个是负的值 但是这个值每次都会变化    还有一个值是3  就这3种情况,这个长的函数得有个几千行代码,而CString有大几十个    我想请教一下,该从哪些可疑的地方去下手查找呢 或者该怎么去定位,崩溃的点在函数的结束位置~ 并不在某个CString变量处~
雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-11 16:29
7
0
yeyeshun 更大概率是局部变量被踩踏了
好的 先谢谢了  我先从踩踏这块查 感谢
雪    币: 205
活跃值: (2599)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
yeyeshun 2 2024-4-11 16:55
8
0
几千行的函数不太规范,建议按功能点或节点进行拆分
雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-11 17:36
9
0
yeyeshun 几千行的函数不太规范,建议按功能点或节点进行拆分
拆不了  我也想拆~几百个数据块各种加密   填充成一格bin文件   我一个一个函数屏蔽了  慢慢查找中
雪    币: 1412
活跃值: (4209)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2024-4-11 17:49
10
0
xxos 拆不了 我也想拆~几百个数据块各种加密 填充成一格bin文件 我一个一个函数屏蔽了 慢慢查找中[em_26]
基本上判定是内存踩踏。 在ref地址上下一个内存断点。看看哪里写入了。然后找一下来源。
雪    币: 1412
活跃值: (4209)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2024-4-11 17:50
11
0
当然 double free也有可能
雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-11 19:15
12
0
IamHuskar 当然 double free也有可能
好的 感谢~ 一个一个查吧
雪    币: 5941
活跃值: (2577)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MSGG05 2024-4-12 21:37
13
0
xxos nRefs 有时候是-1 有时候是一个负值特别大的值 有可能是-2712 也有可能是-365656564,这种的话,是引用计数的问题吧?
如果每次都是固定的CString出问题的话,可以考虑硬件断点。跟踪一下这个nRefs变量的修改操作
雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-18 10:50
14
0
MSGG05 如果每次都是固定的CString出问题的话,可以考虑硬件断点。跟踪一下这个nRefs变量的修改操作
考虑过这个问题  但是只是在函数结束的时候  释放局部变量析构的时候才会崩掉  如果下硬断  结果是一样的  要么按着析构局部CString的顺序去查  就很麻烦~   我在函数末尾}下了断   所有的CString是正常的  。等待崩溃的时候 再用鼠标放到CString上看哪个字符串不正常~  之前崩溃的时候鼠标移动到CString变量上都不显示字符串的内容。。。那天crash后奇迹般的显示了~也是个vs的bug吧。。。有个CString  假设是cst1和cst2  存放着cedit1和cedit2的编辑框内容  都用(CW2A)转为了string  转换完string我立即return了  同样操作的cst1正常析构   cst2  就不正常了   好诡异~  
雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-18 10:52
15
0

这锅该vs接着 本来程序crash后  鼠标放到变量上还是能看到变量的内容的  结果一直没显示  后来删了.vs文件   crash后  鼠标移动到变量上才显示了内容 本来是个小小的bug的  结果是编辑器出了个小bug  使得我没法定位。。 感谢解答

最后于 2024-4-18 10:55 被xxos编辑 ,原因: 有句关键的话没输入进去
雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-18 10:55
16
0
xxos 考虑过这个问题 但是只是在函数结束的时候 释放局部变量析构的时候才会崩掉 如果下硬断 结果是一样的 要么按着析构局部CString的顺序去查 就很麻烦~ 我在函数末尾}下了断 所有 ...
这锅该vs接着 本来程序crash后  鼠标放到变量上还是能看到变量的内容的  结果一直没显示  后来删了.vs文件   crash后  鼠标移动到变量上才显示了内容 本来是个小小的bug的  结果是编辑器出了个小bug  使得我没法定位。。 感谢解答
雪    币: 5941
活跃值: (2577)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MSGG05 2024-4-20 09:50
17
0
xxos 考虑过这个问题 但是只是在函数结束的时候 释放局部变量析构的时候才会崩掉 如果下硬断 结果是一样的 要么按着析构局部CString的顺序去查 就很麻烦~ 我在函数末尾}下了断 所有 ...
其实不建议用W2A这种东西,特别是你的代码中存在大量的使用的话。这玩意用的栈内存,大量使用或递归的话可能溢出。
雪    币: 5941
活跃值: (2577)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MSGG05 2024-4-20 09:59
18
0


看看你有没有左边的情况

雪    币: 832
活跃值: (312)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxos 2024-4-20 14:14
19
0
MSGG05 其实不建议用W2A这种东西,特别是你的代码中存在大量的使用的话。这玩意用的栈内存,大量使用或递归的话可能溢出。
是的  之前的一个ftp工具  大量用到W2A  确实用到了递归和循环  崩的人头疼
游客
登录 | 注册 方可回帖
返回