如何从Delphi模块中的访问违规地址中找到代码



让我通过考虑两个dll来解释这个问题。假设abc.exe正在使用xyz.dll。在运行abc.exe(Delphi(时,出现访问冲突。

项目abc.exe引发异常类EAccessViolation,消息为"模块"xyz.dll"中地址39275E81处的Access Violation。写入地址737A24A4";。

由于某种原因,我无法调试xyz.dll(也是delphi(。所以我想使用上面消息中的地址来跟踪xyz.dll中的代码部分。我怎样才能找到那个代码部分?还有其他选择吗?

提前谢谢。

有许多第三方工具可以跟踪源代码中的异常,也可以自己制作。这个简单的使用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);

通过这种方式,您将在代码中注册任何异常,并将异常的调用堆栈存储到文件中以供进一步分析。

好吗?

你可以使用两种方式:

1Delphi选项>调试器选项>Embarcadero首次亮相>语言异常,取消选中"中的所有选项;异常类型不能忽略";。

2使用调试器并查看所有对象,当您找到值为nil的对象时,您"发现问题";。

请记住:Acess冲突错误是由于Acess从未创建的对象而引起的。

最新更新