内存报错,ECX为0

fandh 2009-06-02 11:14:06
原帖如下:
CheckData()中出错,
很奇怪的错,出错时调试
_info值证常,并且里面的指针值都正常,但从汇编调试看出,
出错在比较语句:*((uint32*)_info.DataPtr) == 0x01000000

先是MOV PTR this到EAX,再MOV [EAX+8]到ECX(ECX应该放的是_info.DataPtr的地址),用ECX的值与0x01000000比较,但此时ECX的值是0


C/C++ code
class MediaData
{
public:
/*
* 帧信息
*/
struct MediaDataInfo
{
MediaDataType MediaDataType;
PicSize PicSize;
uint8* DataPtr;
uint32 DataLength;
uint32 Sequence;
uint32 Frequence;
Timestamp Timestamp;
};

MediaDataInfo _info;
...
};

void MediaData::CheckData()
{
if(_info.DataLength < 8)
return;
if(_info.MediaDataType == VIDEO_H264)
{
if(*((uint32*)_info.DataPtr) == 0x01000000) //在这里出错
{
....
}
else if(*((uint32*)_info.DataPtr) == 0x01000000)
{
....
}
}
}


链接如下:http://topic.csdn.net/u/20090602/09/0a75cccc-9f70-427c-902a-3bd7508dadf0.html?seed=625246241
替peimoxu 发帖!
补充一下:
这个错误在控件中!

解决后,就给分!
...全文
252 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
UDX协议 2009-09-04
  • 打赏
  • 举报
回复
MediaData,我觉得这个对象本身已经被release了。

所以,他里面的一些转换或调用都是失败的,不可预知的。
fandh 2009-06-04
  • 打赏
  • 举报
回复
已经解决了,多线程的问题!
peimoxu 自己分析的方向很准的!
jian_tian_yang 2009-06-04
  • 打赏
  • 举报
回复
帮楼主顶一下
oyljerry 2009-06-03
  • 打赏
  • 举报
回复
多线程操作同一个变量等,多打印一些信息等,看是否出现同时访问,注意线程同步操作等,加锁lock
autumn1225 2009-06-03
  • 打赏
  • 举报
回复
建议使用内存断点进行分析。

一般,内存断点在OD上,至少为4K,而且一次调试只可以设置一次。

个人感觉,只是内存被其它线程更改。

所以,检查多线程,必要时可考虑阻塞其它线程。

考虑到,错误不易重现,可对内存操作线程重点分析,并打印操作日志,打印时,保存时间信息和对应地址信息。



fandh 2009-06-03
  • 打赏
  • 举报
回复
还有什么好的建议?
bragi523 2009-06-02
  • 打赏
  • 举报
回复
*((uint32*)_info.DataPtr
这样对一个指针操作应该是不对的
如果想要这样操作的话得new出来
hendriclee 2009-06-02
  • 打赏
  • 举报
回复
ECX为0?ECX是this指针……
peimoxu 2009-06-02
  • 打赏
  • 举报
回复
代码很少:



void MediaData::CheckData()
{
if(_info.DataLength < 8)
return;
if(_info.MediaDataType == VIDEO_H264 ||
_info.MediaDataType == VIDEO_H264_HID1 ||
_info.MediaDataType == VIDEO_H264_IVS)
{
if(*((uint32*)_info.DataPtr) == 0x01000000 && //出错点。出错时,变量监视显示DataPtr不为NULL,其内存内容为:00 00 00 01 21 ....是预期值
*(_info.DataPtr+4) == 0x27)
{
//I帧
}
else if(*((uint32*)_info.DataPtr) == 0x01000000 &&
*(_info.DataPtr+4) == 0x21)
{
//P帧
}
}
}
; *((uint32*)_info.DataPtr) == 0x01000000
mov eax, DWORD PTR _this$[ebp]
mov ecx, DWORD PTR [eax+8]
cmp DWORD PTR [ecx], 0x01000000 //ecx为0
oyljerry 2009-06-02
  • 打赏
  • 举报
回复
错误在控件中? 可以增加一些 _info.DataPtr 的日志等信息,出问题的时候查看
老邓 2009-06-02
  • 打赏
  • 举报
回复
应该是强制转换的问题。注意高、低位转换。
wocow3 2009-06-02
  • 打赏
  • 举报
回复
300分。。出手可真大方
fandh 2009-06-02
  • 打赏
  • 举报
回复
还有么?
Kerrie 2009-06-02
  • 打赏
  • 举报
回复
DataPtr不为NULL,其内存内容为:00 00 00 01 21

DataPtr为一个指针,他的值不应该为00 00 00 01 21这样的吧,更像其内容或者无效值。


请检查一下this指针是否有效?以及DataPtr的分配代码是否有误
会思考的草 2009-06-02
  • 打赏
  • 举报
回复
_info.DataPtr是不是在堆上分配的?
怎么感觉像是内存越界了导致有效内容被脏数据覆盖了。
建议用pageheap工具查一下。
简单用法:
gflags -p /enable <yourapp>.exe /full
详细用法:
http://support.microsoft.com/kb/286470

当然也可以等到_info.DataPtr指向内存被分配了之后,用windbg的ba命令监视_info.DataPtr指向的首地址。
fandh 2009-06-02
  • 打赏
  • 举报
回复
还有其它建议么?
cnzdgs 2009-06-02
  • 打赏
  • 举报
回复
DataPtr中储存的指针为空,看一下DataPtr的值是怎么来的。
greatws 2009-06-02
  • 打赏
  • 举报
回复
uint8* DataPtr;
如果这个指针为0,那么就是ecx为0。

看看代码其他地方有什么问题,导致DataPtr为NULL,这点代码看不出问题。
闪破风浪 2009-06-02
  • 打赏
  • 举报
回复
打日志,定位错误?
可以用BoundsChecker检测一下。。。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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