首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定在程序中使用.dmp和WinDbg发生崩溃的位置?

如何确定在程序中使用.dmp和WinDbg发生崩溃的位置?
EN

Stack Overflow用户
提问于 2022-11-10 20:51:20
回答 1查看 63关注 0票数 0

我有一个巨大的应用程序(用PowerBuilder制作),它每隔一段时间就会崩溃一次,所以很难重现这个错误。我们已经设置了它,以便当这样的崩溃发生时,我们接收到一个.dmp文件。

我使用WinDbg来使用命令!analyze -v分析.dmp文件。由此可以推断出所发生的错误是访问冲突C0000005。基于和1参数,它试图取消引用空指针。

WinDbg还向我展示了由大约30行组成的STACK_TEXT,但我不知道如何阅读。据我所见,我需要使用某种符号。

我的STACK_TEXT的第一行是:

代码语言:javascript
运行
复制
00000000`00efca10 00000000`75d7fa46     : 00000000`10df1ae0 00000000`0dd62828 00000000`04970000 00000000`10e00388 : pbvm!ob_get_runtime_class+0xad

从这一点出发,我的目标是分析这个文件,找出这个错误在程序中的确切位置,或者它在哪个函数中发生。这是我在进一步分析堆栈跟踪之后能够找到的东西吗?

如何使用.dmp和WinDbg确定程序中的崩溃发生在何处,以便修复代码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-21 18:16:00

如果使用!analyze -v分析崩溃转储,则STACK TEXT后面的行是堆栈跟踪。如果您设置了正确的线程和上下文,则输出等同于kb

kb的输出是

stack

  • Symbol

上的

  1. 子EBP
  2. 返回地址
  3. 前4个值

backticks `告诉您,您在64位中运行,它们在中间拆分64位值。

在32位上,堆栈上的前4个参数通常与函数的前4个参数等效,这取决于调用约定。

在64位上,堆栈不再相关,因为使用64位调用约定,参数通过寄存器传递。因此,您可能可以忽略这些值。

有趣的部分是像pbvm!ob_get_runtime_class+0xad这样的符号。!前面是模块名,通常是DLL或EXE名称。找些你造的东西。在!之后和+之前是一个方法名。在+之后是从函数开始时的偏移量(以字节为单位)。

只要您没有包含数千行代码的函数,这个数字就应该很小,比如< 0x200。如果数字大于这个值,它通常意味着您没有正确的符号。在这种情况下,方法名不再可靠,因为它可能只是最后一个已知的(最后导出的)方法名,并且是离它很远的一种方法,所以不要信任它。

对于pbvm!ob_get_runtime_class+0xadpbvm是DLL名称,ob_get_runtime_class是方法名,+0xad是指令指针所在的方法中的偏移量。

在我看来(对PowerBuilder一无所知),PBVM听起来就像虚拟内存的PowerBuilder DLL实现。这不是你的代码,而是Sybase编译的代码。您需要进一步查看调用堆栈,以便在DLL中找到罪魁祸首代码。

在阅读维基百科之后,PowerBuilder似乎不一定要编译成本地代码,而是编译为中间的P代码。在这种情况下,您可能运气不佳,因为您的代码从来没有真正在调用堆栈上,您需要一个特殊的调试器或WinDbg扩展(这可能不存在,就像Java那样)。使用-pbdebug命令行开关运行它,或者将它编译成本机代码,然后让它再次崩溃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74395164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档