CE下如何实现错误报告功能?

MS_Frank 2010-04-03 01:22:13
如题,我最近写了个程序(Windows Mobile上的)在模拟器上测试无任何问题,可是一拿到真机上就偶尔会出错,出错的原因是访问了未对齐的数据,我代码检查了好多遍也没发现哪错了。

我使用如下方法能捕获到这个异常
__try
{
...
}
__except(HandleException(GetExceptionInformation()))
{
...
}
得到一个LPEXCEPTION_POINTERS结构,在这个结构里面能获得异常地址(ExceptionAddress)。
其实到问题已经可以解决了;比如 :*(LPBYTE)NULL=2,这句代码产生异常被捕获到,ExceptionAddress就是首先异常的代码地址,拿着这个地址到.map文件中就可以找到产生错误的代码。
但是如果int a=0; a/=a; 这样的除0异常被捕获到后ExceptionAddress的地址不是产生异常的地址,而是跑到了coredll.dll里面去了。

我试过用CaptureDumpFileOnDevice首先dump文件,这个函数在真机上测试老失败,不用它也罢。我只是想在产生异常时得到异常的地址,使之可以在.map文件中找到产生错误的函数就行,然后我可以仔细慢慢检查那个函数就行了。如果实在得不到准确的产生错误的地址能得到异常时的函数调用堆栈也行。

求各位大哥大姐们帮帮我吧,这个问题困扰我好几天了!!!


...全文
315 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengzhi670385875 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sniper167 的回复:]
用这个笨办法如何?
就是多加调试信息,通过串口打印,跟踪到具体哪行代码出错,然后分析?
没串口的话,把打印信息写成文件。
[/Quote]

我现在在做个产品,想在一个INAND下生成错误码报告,按博主的方法修改了注册表http://www.cnblogs.com/we-hjb/archive/2009/09/20/1570485.html
,而且DrWatsonGetSize也是300KB了,但不知为何生不成呢?

急求各位大牛帮下忙……
fengzhi670385875 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sniper167 的回复:]
用这个笨办法如何?
就是多加调试信息,通过串口打印,跟踪到具体哪行代码出错,然后分析?
没串口的话,把打印信息写成文件。
[/Quote]



我现在在做个产品,想在一个INAND下生成错误码报告,按博主的方法修改了注册表,而且DrWatsonGetSize也是300KB了,但不知为何生不成呢?

急求各位大牛帮下忙……
MS_Frank 2010-04-14
  • 打赏
  • 举报
回复
如果没有设置,能不能在我的代码中设置一下它呢?
因为我做的软件,将来要运行到别人的机器上的,我不可能对系统改动太大。

在我机器上dwNKDrWatsonSize好像是设置了,因为我调用DrWatsonGetSize()获取到的值远大于128.

红牛哥110 2010-04-12
  • 打赏
  • 举报
回复
CE4.2上沒有這個組件, 想試都試不成,唉.
ruritanian 2010-04-12
  • 打赏
  • 举报
回复
error report需要你OAL支持的,你先看看在OEMInit里面有没有设置足够大小的 dwNKDrWatsonSize,至少要128kb才行。
还有就是需要设置SYSGEN_WATSON_DMPGEN
MS_Frank 2010-04-10
  • 打赏
  • 举报
回复
刚才我查看了一下CaptureDumpFileOnDevice源代码,有了一点进展。
BOOL CaptureDumpFileOnDevice(DWORD dwProcessId, DWORD dwThreadId, LPCWSTR pwzExtraFilesPath)
{
BOOL fHandled = FALSE;
DWORD dwArguments[5];
WCHAR wzCanonicalExtraFilesPath[MAX_PATH];
BOOL fReportFault = (dwProcessId == (-1)) && (dwThreadId == (-1));
DWORD dwArg2 = 0;

if (!fReportFault)
{
if (pwzExtraFilesPath)
{
if (!CeGetCanonicalPathNameW(pwzExtraFilesPath, wzCanonicalExtraFilesPath, ARRAY_SIZE(wzCanonicalExtraFilesPath), 0))
{
fHandled = FALSE;
SetLastError(ERROR_BAD_PATHNAME);
goto Exit;
}
dwArg2 = (DWORD)wzCanonicalExtraFilesPath;
}
}
else
{
// For ReportFault this is actually the pointer to the exception
dwArg2 = (DWORD)pwzExtraFilesPath;
}

dwArguments[0] = dwProcessId;
dwArguments[1] = dwThreadId;
dwArguments[2] = dwArg2;

// We pass in the CurrentTrust as an extra safety check in DwDmpGen.cpp
// DwDmpGen.cpp will do additional trust level checking.
dwArguments[3] = CeGetCurrentTrust();
dwArguments[4] = (DWORD)&CaptureDumpFileOnDevice;

__try
{
// This exception will be handled by OsAxsT0.dll if
// we succesfully generate a dump file. The RaisException
// will return if handled, otherwise it will caught by the
// the try catch block.
RaiseException(STATUS_CRASH_DUMP,0,5,&dwArguments[0]);
fHandled = TRUE;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
// We end up here if no dump was captured, in which case we return FALSE
fHandled = FALSE;
if (ERROR_SUCCESS == GetLastError())
{
SetLastError(ERROR_NOT_SUPPORTED);
}
}

Exit:

return fHandled;
}

RaiseException(STATUS_CRASH_DUMP,0,5,&dwArguments[0]);
在这句中代码出现了异常,所以到了except中。
真正的实现代码好像在OsAxsT0.dll中,请问这个库的代码在哪里呀?
MS_Frank 2010-04-10
  • 打赏
  • 举报
回复
大哥大姐们谁帮帮我呀!
sunrain_hjb 2010-04-09
  • 打赏
  • 举报
回复
Sniper167 2010-04-09
  • 打赏
  • 举报
回复
用这个笨办法如何?
就是多加调试信息,通过串口打印,跟踪到具体哪行代码出错,然后分析?
没串口的话,把打印信息写成文件。
MS_Frank 2010-04-09
  • 打赏
  • 举报
回复
谢谢二位楼上的,经过我这几天的琢磨自己获取调用栈太难了,所以我决定还是用CE提供的CaptureDumpFileOnDevice来生成dump文件吧。

注册表中的相关设置我已经打开了
HKEY_Local_Machine\System\ErrorReporting\DumpSettings
DumpEnabled=1

但是一调用还是失败,GetLastError返回0x00000032(The network request is not supported.)
但是我在模拟器上同样没有网络连接,也可以成功的啊,怎么在真机上就不行了呢。
MS_Frank 2010-04-09
  • 打赏
  • 举报
回复
谢谢楼上的兄弟,好像是你说的情况,因为在我真机上,任何程序崩溃了都没有任何提示,而在模拟器上有程序崩溃了就会显示错误报告界面。

但是我检查过我机器上的相关文件,跟据MSDN上所说错误报告模块需要hd.dll OsAxsT0.dll等相关文件,这些文件在我机器上都有啊,还有注册表的设置HKEY_Local_Machine\System\ErrorReporting\DumpSettings
我也检查过了,但还是不行。。

请问这该怎么解决呀?
ruritanian 2010-04-09
  • 打赏
  • 举报
回复
0x32这个错误号的意思是ERROR_NOT_SUPPORTED,意思是没有抓到dump file,说明在系统中没有启动Dr. Waston(error report)
MS_Frank 2010-04-09
  • 打赏
  • 举报
回复
实在没办法了,前面几位兄弟提的方法我都试过,但是在真机上一调用还是失败,
GetLastError返回0x00000032(The network request is not supported.)

我拿我自己的机器和我同事的机器同样是这个错误!
MS_Frank 2010-04-09
  • 打赏
  • 举报
回复
上面的网址我看过,我就是按它的设置的,还是不行。
Taiyangchen 2010-04-08
  • 打赏
  • 举报
回复
用日志来纪录,首先你在WinCE下是无法调试的,因为你都是將程序放在PND里运行的,在我们公司都是加日志来记录错误信息的,然后根据日志找到错误的原因。
guopeixin 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guopeixin 的回复:]

你可以打开ce的error report,然后用waston或者windbg来分析产生的dump file,具体的方法一句话也说不清,你可以查看一下网上的相关介绍,呵呵
个人愚见,仅供参考
[/Quote]
不好意思,说错了,应该是crash file
guopeixin 2010-04-08
  • 打赏
  • 举报
回复
你可以打开ce的error report,然后用waston或者windbg来分析产生的dump file,具体的方法一句话也说不清,你可以查看一下网上的相关介绍,呵呵
个人愚见,仅供参考
MS_Frank 2010-04-08
  • 打赏
  • 举报
回复
没有回答我吗?
flyyyri 2010-04-04
  • 打赏
  • 举报
回复
顶一个
kyzf 2010-04-03
  • 打赏
  • 举报
回复
不会,帮顶下。

MARK.
加载更多回复(2)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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