如何从源代码中查找数据中止异常函数/指令?

时间:2017-08-18 09:56:17

标签: c++ windows visual-studio windows-ce msdn

我正在设备上运行应用程序,该设备可以通过串行USB接口连接外部附件。我注意到,当从USB端口拔下配件时,设备会挂起。串行日志显示抛出了数据中止异常:

  

[ERROR] PID:00400003 TID:0250001A异常'数据中止' (0x4):Thread-Id = 0250001a(pth = bd8d2660),Proc-Id = 00400002(pprc = 8534a5e0)' NK.EXE',VM-active = 046b0082(pprc = bd895298)' Osl_Spec.exe'

     

[ERROR] PID:00400003 TID:0250001A PC = 8042f520(kernel.dll + 0x00014520)RA = cb33fdf0(??? + 0xcb33fdf0)SP = dcfffae8,BVA = 00000014

     

[ERROR] PID:00400003 TID:0250001A异常'引发异常' (0x116):Thread-Id = 0250001a(pth = bd8d2660),Proc-Id = 00400002(pprc = 8534a5e0)' NK.EXE',VM-active = 046b0082(pprc = bd895298)' Osl_Spec.exe'

     

[ERROR] PID:00400003 TID:0250001A PC = eff0e4d8(k.coredll.dll + 0x0001e4d8)RA = 80429648(kernel.dll + 0x0000e648)SP = dcfff1fc,BVA = ffffffff

     

[ERROR] PID:00400003 TID:0250001A异常'数据中止' (0x4):Thread-Id = 0250001a(pth = bd8d2660),Proc-Id = 00400002(pprc = 8534a5e0)' NK.EXE',VM-active = 046b0082(pprc = bd895298)' Osl_Spec.exe'

     

[ERROR] PID:00400003 TID:0250001A PC = 8042f520(kernel.dll + 0x00014520)RA = cb33fdf0(??? + 0xcb33fdf0)SP = dcfffad4,BVA = 00000014

     

[ERROR] PID:00400003 TID:0250001A异常'引发异常' (0x116):Thread-Id = 0250001a(pth = bd8d2660),Proc-Id = 00400002(pprc = 8534a5e0)' NK.EXE',VM-active = 046b0082(pprc = bd895298)' Osl_Spec.exe'

     

[ERROR] PID:00400003 TID:0250001A PC = eff0e4d8(k.coredll.dll + 0x0001e4d8)RA = 80429648(kernel.dll + 0x0000e648)SP = dcfff1e8,BVA = ffffffff

我希望得到负责这些异常的源代码部分。我已经阅读了一些文章,建议使用RA旁边显示的驱动程序文件的MAP文件(返回地址),但在我的错误中,我看到" ???"而不是驱动程序文件名。 OSL_SPEC.exe是我的应用程序。请建议我如何在代码中找到问题的根源。

1 个答案:

答案 0 :(得分:0)

有多种方法可以做到这一点,但首先你需要用调试标志编译你的文件。 如果你已经完成了,并且你的bug是可重现的,那么你可以在你的代码中使用停止点以调试模式运行你的文件(在linux上你可以用gdb来做,在windows上它可能存在这种工具)。 如果你的bug是不可重用的,你应该找到一种方法来捕获main函数中的异常并返回调用堆栈。然后在Windows上使用addr2line的副本来查找导致异常的函数。

我注意到您的日志会谈到kernel.dllk.coredll.dll。这些文件是您项目的一部分(如lib)还是您的VM? 如果它们是您项目的一部分,您应该关注这些文件(+地址偏移)。