【问题标题】:How to find code from access violation address in a Delphi module?如何从 Delphi 模块中的访问冲突地址中查找代码?
【发布时间】:2021-11-05 07:28:41
【问题描述】:
abc.exe 正在使用 xyz.dll。在运行 abc.exe(Delphi) 时,得到如下访问冲突
项目 abc.exe 引发异常类 EAccessViolation,并带有消息“模块“xyz.dll”中地址 39275E81 的访问冲突。写入地址 737A24A4"。
由于某种原因,我无法调试 xyz.dll(也是 delphi)。
因此,我想使用上述消息中的地址跟踪 xyz.dll 中的代码部分。如何找到该代码部分?还有其他选择吗?
提前致谢。
【问题讨论】:
-
你有提到的DLL的源代码吗?如果是这样,请按照this 问题的答案中的说明操作,了解如何在 Delphi 中正确调试 DLL
标签:
delphi
dll
access-violation
【解决方案1】:
有很多第三方工具可以跟踪源代码中的异常,您也可以自己制作。这个简单的一个使用 JCL 调试过程:
procedure AnyExceptionNotify(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean);
var
ExceptLines: TStringList;
begin
ExceptLines := TStringList.Create;
try
JclLastExceptStackListToStrings(ExceptLines, False, False, True);
ExceptLines.Insert(0, 'ProcessID: ' + IntToStr(GetCurrentProcessID));
ExceptLines.Insert(1, 'ThreadID: ' + TThread.CurrentThread.ThreadID.ToString);
ExceptLines.Insert(2, (ExceptObj as Exception).Message);
ExceptLines.Insert(3, '[begin_stack_trace]');
ExceptLines.Append('[end_stack_trace]');
ExceptLines.SaveToFile('ExceptTrace.txt');
finally
ExceptLines.Free;
end;
end;
initialization
JclStartExceptionTracking;
JclAddExceptNotifier(AnyExceptionNotify);
这样您将在代码中注册任何异常并将异常的调用堆栈存储到文件中以供进一步分析。
【解决方案2】:
就这样吧?
你可以使用两种方式:
1 Delphi Options >Debugger Option > Embarcadero Debugge> Language Exception,取消勾选“Exception types ton ignore”中的所有选项。
2 使用调试器并查看所有对象,当您找到值为nil 的对象时,您“找到了问题”。
记住:访问冲突错误是由访问尚未创建的对象引起的。