如何使用IIS调试诊断报告在Delphi COM组件中定位源文件行

如何使用IIS调试诊断报告在Delphi COM组件中定位源文件行,delphi,iis,com,debugging,Delphi,Iis,Com,Debugging,我们有一个从ISAPI web应用程序调用的Delphi COM组件。COM组件挂起应用程序,因为它试图显示MessageBox()。我们的用户代码中没有MessageBox()调用,因此它必须位于Delphi运行时源代码中,可能位于异常处理程序代码中 我们有一个IIS调试诊断报告,其中显示模块名+偏移地址作为违规代码 我们的模块有一个.MAP文件,我们还使用MAP2DBG生成了一个.dbg文件 我们的问题是,如何使用包含偏移地址的IIS调试诊断挂起报告,使用.MAP或.DBG文件来定位源文件代

我们有一个从ISAPI web应用程序调用的Delphi COM组件。COM组件挂起应用程序,因为它试图显示MessageBox()。我们的用户代码中没有MessageBox()调用,因此它必须位于Delphi运行时源代码中,可能位于异常处理程序代码中

我们有一个IIS调试诊断报告,其中显示模块名+偏移地址作为违规代码

我们的模块有一个.MAP文件,我们还使用MAP2DBG生成了一个.dbg文件

我们的问题是,如何使用包含偏移地址的IIS调试诊断挂起报告,使用.MAP或.DBG文件来定位源文件代码行


我们已经尝试使用WinDbg,但无法确定需要做什么来定位源代码行

首先,您需要找到进程将COM模块加载到IIS进程的基址-IIS调试日志可能会显示这一点。我们把这个叫做基地

然后计算MAPoffset=offset-BASE-$1000,就可以在Delphi映射文件中搜索到一个地址

在映射文件(应详细说明以获得行号映射)中,您将找到每个源模块的一个部分,其中列出了“行号段:偏移”的记录。然后检查MAPoffset是否等于一个偏移或在两个线号偏移之间。这应该给你一个方向,哪条线是违规的

段通常为1-表示包含生成代码的文本段-(在映射文件的顶部有一个段映射)


希望这有帮助

首先,您需要找到进程将COM模块加载到IIS进程的基址-IIS调试日志可能会显示这一点。我们把这个叫做基地

然后计算MAPoffset=offset-BASE-$1000,就可以在Delphi映射文件中搜索到一个地址

在映射文件(应详细说明以获得行号映射)中,您将找到每个源模块的一个部分,其中列出了“行号段:偏移”的记录。然后检查MAPoffset是否等于一个偏移或在两个线号偏移之间。这应该给你一个方向,哪条线是违规的

段通常为1-表示包含生成代码的文本段-(在映射文件的顶部有一个段映射)


希望这有帮助

+1个好答案。映射文件是发现bug的关键,理解映射文件是发现部署后弹出的讨厌AV错误的秘密。出于这个原因,我倾向于将源代码管理中的映射文件标记为某个版本的源代码。转储文件的IIS调试报告将ModuleName+4974列为有问题的地址。使用WinDbg加载转储文件时,模块启动为064F0000。所以064F4974-064F000=4974。4974-1000是3974。我在.map文件中看不到任何接近这个数字的东西。我遗漏了什么?在你的地图文件中,你应该有一个靠近顶部的部分,叫做“分段详细列表”。在本节中,我的映射文件中的第一行如下所示:0001:00000000 00006B49 C=代码S=.text G=(无)M=系统ACBP=A9这是类型1(.text)的段,从0开始,运行$6B49字节。如果这是您的地图文件,它会告诉我您的模块是“系统”模块。现在,假设您已经识别了您的模块,那么该模块应该有这样一个部分:“System(GETMEM.INC)segment.text的行号”。在这个行号部分中,我会找到一个“记录”,上面写着:9292 0001:00003974-这意味着System.pas中的9292行起价为3974美元。然后您将转到system.pas-Line9292查找线路。非常感谢您提供的额外帮助。我们现在确切地知道在哪里引发了异常。不幸的是,它位于RTL的深处,在RTL中,COM dll是在汇编语言过程中初始化的。在被调用的异常处理程序中检查IsConsole,以便不显示MessageBox()对话框。使用{$APPTYPE CONSOLE}编译器指令时,IsConsole设置为True。尽管帮助中指出{$APPTYPE CONSOLE}在库中没有任何意义,但我们将尝试使用它来抑制MessageBox()对话框。+1很好的答案。映射文件是发现bug的关键,理解映射文件是发现部署后弹出的讨厌AV错误的秘密。出于这个原因,我倾向于将源代码管理中的映射文件标记为某个版本的源代码。转储文件的IIS调试报告将ModuleName+4974列为有问题的地址。使用WinDbg加载转储文件时,模块启动为064F0000。所以064F4974-064F000=4974。4974-1000是3974。我在.map文件中看不到任何接近这个数字的东西。我遗漏了什么?在你的地图文件中,你应该有一个靠近顶部的部分,叫做“分段详细列表”。在本节中,我的映射文件中的第一行如下所示:0001:00000000 00006B49 C=代码S=.text G=(无)M=系统ACBP=A9这是类型1(.text)的段,从0开始,运行$6B49字节。如果这是您的地图文件,它会告诉我您的模块是“系统”模块。现在,假设您已经识别了您的模块,那么该模块应该有这样一个部分:“System(GETMEM.INC)segment.text的行号”。在这个行号部分中,我会找到一个“记录”,上面写着:9292 0001:00003974-这意味着System.pas中的9292行起价为3974美元。然后您将转到system.pas-Line9292查找线路。非常感谢您提供的额外帮助。我们现在确切地知道在哪里引发了异常。不幸的是,它位于RTL的深处,在RTL中,COM dll是在汇编语言过程中初始化的。在中有一个IsConsole的检查