变量自动改变值,怪了!bc2007

yingbinchina 2008-11-04 10:47:45
我有一个codegear bc2007的工程。

在一个类中有一个数据成员bool bValue,在初始化我将其设置为false,

bValue = false;

在funcA()中我有一条语句设置其为true:其它地方没有在使用变量bValue的了
funcA()
{
..............
bValue = true;
}

在FuncB()我用到了这个变量:
funB()
{
if (bValue)//增加了断点C
{..............
}
}

我debug,在funB中增加了断点C,发现bValue的值变成true了,很奇怪,因为并没有调用funcA呀,它在什么情况下自己就变了呢?我百思不得其解,
请问大家有过这样的经历吗?是如何解决的。谢谢!
...全文
265 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
truelove7283159 2008-11-08
  • 打赏
  • 举报
回复


[Quote=引用 16 楼 shadowstar 的回复:]
1. 断点设在funcA(),这样就会知道什么时候调用了funcA
2. 如果没有调用过funcA,那可能是你的指针使用不当,不小心给funcA赋值,可以检查一下定义在bValue附近的变量的使用情况
3. 如果还没有有检查出来的话检查一下类对象的调用
[/Quote]


指针,内存, 其实就是这两个。
看看调用堆栈的情况,MAYBE这个时候stack已经破坏了, 你所有的东西都不对了.


4, 你确定你这个工程的目标文件.EXE DLL .OBJ是唯一,最新的吗,有没有调试地方和运行地方不一样.
这个时候也回乱,哈哈:) 稍微认真点就找出来了.
勉励前行 2008-11-07
  • 打赏
  • 举报
回复
2.同样的程序代码在同事的机器上没有发生指针越界的现象,和机器内存还有什么潜在的关系吗?
a、可能为使用了未初始化的指针,该现象在不同的机器上会有不同的表现。检查是否所有的指针均初始化了。如果使用数组,则明确是否需要初始化。
b、已经证实你的程序有越界现象,你可以针对该类检查有无数组越界或指针越界。
c、指针问题要完全靠调试找出来,是很困难的,因为问题不一定是这个类的指针引起的,其他地方的野指针也可能引发这个问题。依照经验,问题往往是类本身及与该类有紧密关系的类引起的。
d、按照你说的退出时弹出AV错误,不同的电脑表现不一。我个人估计你是使用了野指针,即“未初始化的指针”或“无效指针”。打开编译检查,看看编译时的警告或许可以快速定位错误。
e、析构次序不对,则可能在退出程序时发生异常。C++类要程序员自行处理析构次序。

可能的情况应该还会有很多,具体问题具体分析,希望你能找到BUG所在吧。我的程序偶尔也会发生退出时异常,但不频繁。我同样处理不了,因为那也可能是操作系统或者其他应用程序冲突,要知道编写强壮的程序是多么的困难,至少微软做不到。
laowang2 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 PPower 的回复:]
測試一下是否越界的問題:
在一个类中有一个数据成员bool bValue
class XXX
{
...
char buff1[1000]; //插入內存,進行越界保護
bool bValue;
char buff2[1000];//插入內存,進行越界保護
...
};
如果如上面那樣處理過後,沒有異常出現了,那表示你的程序存在指針越界現象。
[/Quote]
yuanreid 2008-11-05
  • 打赏
  • 举报
回复
只能增加对内存操作的保护和范围检查,特别是类似strcpy要慎用,目前对strcpy有增强版本函数,增加了长度定义,这样会好些
yingbinchina 2008-11-05
  • 打赏
  • 举报
回复


我在推出程序的时候即运行formDestroy,单步执行FormDestroy的语句都没有问题,但是仍会弹出Access violation的错误框,跟踪调试,
发现在bds2007\..\sys\system.pas的文件中,运行到如下代码处发生错误,我猜想也是和缓冲区溢出有关系,请大家给一些修改的建议,谢谢!


{$ELSE}
asm
{ -> EAX pointer to str }

MOV EDX,[EAX] { fetch str }
TEST EDX,EDX { if nil, nothing to do }//在下边三行之内出问题
JE @@done
MOV dword ptr [EAX],0 { clear str }
MOV ECX,[EDX-skew].StrRec.refCnt { fetch refCnt }
DEC ECX { if < 0: literal str }
yingbinchina 2008-11-05
  • 打赏
  • 举报
回复


正如PPower所说:我在bValue的前后插入了内存,发现问题解决了。bValue的值没有被改变,非常感谢各位高手的热心帮助。

再请问:

1.如何避免这样的情况发生呢?
2.同样的程序代码在同事的机器上没有发生指针越界的现象,和机器内存还有什么潜在的关系吗?

fieldisme 2008-11-05
  • 打赏
  • 举报
回复
同意楼上,有可能是缓冲区溢出,如果在WndProc中用无边界检验的函数访问了类中与bool bValue相邻近的变量,就可能导致修改bValue的值
jxw1987628 2008-11-04
  • 打赏
  • 举报
回复
是否其他地方有与bValue同名的变量?

或者你在其他地方对它操作过了?
yuanreid 2008-11-04
  • 打赏
  • 举报
回复
funcA是否是回调函数。直接断点设置到funcA上看看是否被执行过。慢慢跟踪会找到的。
yingbinchina 2008-11-04
  • 打赏
  • 举报
回复
我查找了,没有地方调用funcA。我在它里边设置了断点,也没有跳到里边,没有调用。

这个问题太奇怪了。是开发工具的问题吗?
Jim@luckeeinc.com 2008-11-04
  • 打赏
  • 举报
回复
你有再其他地方用過funcA()嗎
比如什麽form的一些事件裏面
你Ctrl + F 看一下調用funcA()的地方 應該是之間有調用后 沒有把bValue的值設回來的原因吧
勉励前行 2008-11-04
  • 打赏
  • 举报
回复
測試一下是否越界的問題:
在一个类中有一个数据成员bool bValue
class XXX
{
...
char buff1[1000]; //插入內存,進行越界保護
bool bValue;
char buff2[1000];//插入內存,進行越界保護
...
};
如果如上面那樣處理過後,沒有異常出現了,那表示你的程序存在指針越界現象。
我来看看CB 2008-11-04
  • 打赏
  • 举报
回复
奇怪的问题。不过一般都是代码本身的问题。
shadowstar 2008-11-04
  • 打赏
  • 举报
回复
这里只能告诉你解决的方法,而不能帮你解决实际的问题,你按我的方法试过没?
yuanreid 2008-11-04
  • 打赏
  • 举报
回复
关注
yingbinchina 2008-11-04
  • 打赏
  • 举报
回复


是这样,这个bValue是main form的变量,由它来控制其它子form的hide函数,即:

if(bValue)
sonform->Hide();

而这里bValue奇怪的变值,让hide函数调用老是出现问题,所以我暂时这样解决吧:

if(bValue)
if(sonform != NULL)
sonform->Hide();

增加一句判断吧。


请高手继续关注!多谢!
shadowstar 2008-11-04
  • 打赏
  • 举报
回复
1. 断点设在funcA(),这样就会知道什么时候调用了funcA
2. 如果没有调用过funcA,那可能是你的指针使用不当,不小心给funcA赋值,可以检查一下定义在bValue附近的变量的使用情况
3. 如果还没有有检查出来的话检查一下类对象的调用
yuanreid 2008-11-04
  • 打赏
  • 举报
回复
你试试将bValue注释掉,看看哪里会出问题
yingbinchina 2008-11-04
  • 打赏
  • 举报
回复


是不是内存发生了冲突。如果发生冲突,bValue的内存被“悄悄地”冲成了一个非零的值,这样就是TRUE了,会发生这样的问题吗?

如何解决呢?
yingbinchina 2008-11-04
  • 打赏
  • 举报
回复

我已经重新安装了bcb codegear 2007, 还是老问题。

WndProc是可以重载的,我试过了。

加载更多回复(8)

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧