5410|20

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CE下如何实现错误报告功能? [复制链接]

如题,我最近写了个程序(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文件中找到产生错误的函数就行,然后我可以仔细慢慢检查那个函数就行了。如果实在得不到准确的产生错误的地址能得到异常时的函数调用堆栈也行。

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


最新回复

如果没有设置,能不能在我的代码中设置一下它呢? 因为我做的软件,将来要运行到别人的机器上的,我不可能对系统改动太大。 在我机器上dwNKDrWatsonSize好像是设置了,因为我调用DrWatsonGetSize()获取到的值远大于128.   详情 回复 发表于 2010-4-14 10:25
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
沙发!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
应该是访问内存错误,看一下指针是否访问了NULL的地址,这样会导致访问非法
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
不会,帮顶下。

MARK.
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 
顶一个
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

6
 
没有回答我吗?
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
你可以打开ce的error report,然后用waston或者windbg来分析产生的dump file,具体的方法一句话也说不清,你可以查看一下网上的相关介绍,呵呵
个人愚见,仅供参考
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(中级)

8
 
引用 6 楼 guopeixin 的回复:

你可以打开ce的error report,然后用waston或者windbg来分析产生的dump file,具体的方法一句话也说不清,你可以查看一下网上的相关介绍,呵呵
个人愚见,仅供参考

不好意思,说错了,应该是crash file
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
用日志来纪录,首先你在WinCE下是无法调试的,因为你都是將程序放在PND里运行的,在我们公司都是加日志来记录错误信息的,然后根据日志找到错误的原因。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

10
 
谢谢二位楼上的,经过我这几天的琢磨自己获取调用栈太难了,所以我决定还是用CE提供的CaptureDumpFileOnDevice来生成dump文件吧。

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

但是一调用还是失败,GetLastError返回0x00000032(The network request is not supported.)
但是我在模拟器上同样没有网络连接,也可以成功的啊,怎么在真机上就不行了呢。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
用这个笨办法如何?
就是多加调试信息,通过串口打印,跟踪到具体哪行代码出错,然后分析?
没串口的话,把打印信息写成文件。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

12
 
[url=http://www.cnblogs.com/we-hjb/archive/2009/09/20/1570485.html][/url]
看看这个,希望有所帮助。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

13
 
上面的网址我看过,我就是按它的设置的,还是不行。
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

14
 
实在没办法了,前面几位兄弟提的方法我都试过,但是在真机上一调用还是失败,
GetLastError返回0x00000032(The network request is not supported.)

我拿我自己的机器和我同事的机器同样是这个错误!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

15
 
0x32这个错误号的意思是ERROR_NOT_SUPPORTED,意思是没有抓到dump file,说明在系统中没有启动Dr. Waston(error report)
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

16
 
谢谢楼上的兄弟,好像是你说的情况,因为在我真机上,任何程序崩溃了都没有任何提示,而在模拟器上有程序崩溃了就会显示错误报告界面。

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

请问这该怎么解决呀?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

17
 
大哥大姐们谁帮帮我呀!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

18
 
刚才我查看了一下CaptureDumpFileOnDevice源代码,有了一点进展。
  1. BOOL CaptureDumpFileOnDevice(DWORD dwProcessId, DWORD dwThreadId, LPCWSTR pwzExtraFilesPath)
  2. {
  3.     BOOL fHandled = FALSE;
  4.     DWORD dwArguments[5];
  5.     WCHAR wzCanonicalExtraFilesPath[MAX_PATH];
  6.     BOOL  fReportFault = (dwProcessId == (-1)) && (dwThreadId == (-1));
  7.     DWORD dwArg2 = 0;

  8.     if (!fReportFault)
  9.     {
  10.         if (pwzExtraFilesPath)
  11.         {
  12.             if (!CeGetCanonicalPathNameW(pwzExtraFilesPath, wzCanonicalExtraFilesPath, ARRAY_SIZE(wzCanonicalExtraFilesPath), 0))
  13.             {
  14.                 fHandled = FALSE;
  15.                 SetLastError(ERROR_BAD_PATHNAME);
  16.                 goto Exit;
  17.             }
  18.             dwArg2 = (DWORD)wzCanonicalExtraFilesPath;
  19.         }
  20.     }
  21.     else
  22.     {
  23.         // For ReportFault this is actually the pointer to the exception
  24.         dwArg2 = (DWORD)pwzExtraFilesPath;
  25.     }
  26.    
  27.     dwArguments[0] = dwProcessId;
  28.     dwArguments[1] = dwThreadId;
  29.     dwArguments[2] = dwArg2;

  30.     // We pass in the CurrentTrust as an extra safety check in DwDmpGen.cpp
  31.     // DwDmpGen.cpp will do additional trust level checking.
  32.     dwArguments[3] = CeGetCurrentTrust();  
  33.     dwArguments[4] = (DWORD)&CaptureDumpFileOnDevice;
  34.    
  35.     __try
  36.     {
  37.         // This exception will be handled by OsAxsT0.dll if
  38.         // we succesfully generate a dump file. The RaisException
  39.         // will return if handled, otherwise it will caught by the
  40.         // the try catch block.
  41.         RaiseException(STATUS_CRASH_DUMP,0,5,&dwArguments[0]);
  42.         fHandled = TRUE;
  43.     }
  44.     __except(EXCEPTION_EXECUTE_HANDLER)
  45.     {
  46.         // We end up here if no dump was captured, in which case we return FALSE
  47.         fHandled = FALSE;
  48.         if (ERROR_SUCCESS == GetLastError())
  49.         {
  50.             SetLastError(ERROR_NOT_SUPPORTED);
  51.         }
  52.     }

  53. Exit:
  54.    
  55.     return fHandled;
  56. }
复制代码

RaiseException(STATUS_CRASH_DUMP,0,5,&dwArguments[0]);
在这句中代码出现了异常,所以到了except中。
真正的实现代码好像在OsAxsT0.dll中,请问这个库的代码在哪里呀?
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

19
 
CE4.2上沒有這個組件, 想試都試不成,唉.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

20
 
error report需要你OAL支持的,你先看看在OEMInit里面有没有设置足够大小的 dwNKDrWatsonSize,至少要128kb才行。
还有就是需要设置SYSGEN_WATSON_DMPGEN
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表