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

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

2024-4-11 11:22
3453

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,局部变量析构的时候,引用计数不对了呢?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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

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

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


看看你有没有左边的情况

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