繁体   English   中英

调试在线程内调用的delphi应用程序/ DLL

[英]debug delphi application / DLL called inside a thread

问题描述 :

.....   ( this code is executed inside a thread.execute 
...

if fileexists(myFile) then 
    begin
    //  call functions inside a  DLL 
    ...
    dll_process_data ( .....) ;
    ....
    end;


.....   (clean up ) 

write_clean_data_fct(...)

.....  //

...    //  AV happens here inside kernel.dll , no further information    

如果找不到该文件,则执行完整的例程/多线程算法不会有任何问题; 如果我添加了其他文件,则在dll内处理了一些数据,这样做也没有麻烦。 现在,在write_clean_data_fct之后的某个地方发生了AV。 在dll里面,我打开一个文件,读取数据并使用这些数据进行数据处理。

问:可能是什么原因以及如何调试此问题? 由于完整的代码序列约为15.000 LOC,因此无法发布更多行代码。

您可以像这样调试DLL:

  1. 在您的IDE中打开DLL项目。
  2. 确保主机将从与DLL项目的输出目录相同的路径加载DLL。
  3. 在要调试的功能上设置一个断点。
  4. 从菜单中选择运行| 主机应用程序并指定主机可执行文件。
  5. 跑。

您现在应该能够调试DLL中的代码。 在现代版本的Delphi中,调试主机可执行文件时,您还应该能够进入DLL代码。 这需要您使用调试信息构建DLL,并且主机可执行文件必须从DLL项目的输出路径中加载DLL。

您的实际问题听起来有些棘手。 访问冲突可能在错误代码执行后很长时间发生。 要进行调试,您可能首先确定引发异常的代码。 该代码的哪一部分的指针可能无效? 然后追溯到DLL中可能已修改该指针的所有内容。

如果静态分析没有帮助,则可以添加调试工具。 您需要:

  1. 启用范围检查以检测明显的缓冲区超限。
  2. 完整的FastMM调试,以检测堆损坏,释放后访问等。
  3. madExcept为实际异常提供详细的诊断和堆栈跟踪。

您将在所有模块中都需要这些工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM