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

时间:2014-04-04 10:44:53

标签: delphi

问题描述:

.....   ( 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中我打开文件读取数据并使用这些数据进行数据处理。

问:什么可能是reasin以及如何调试这个问题? #t可以发布更多代码行,因为完整的代码序列是~15.000 LOC。

1 个答案:

答案 0 :(得分:1)

您可以像这样调试DLL:

  1. 在IDE中打开DLL项目。
  2. 确保主机将从与DLL项目的输出目录相同的路径加载DLL。
  3. 在要调试的函数上设置断点。
  4. 从菜单中选择运行|主机应用程序并指定主机可执行文件。
  5. 运行。
  6. 您现在应该可以调试DLL中的代码。在现代版本的Delphi中,您还应该能够在调试主机可执行文件时进入DLL代码。这要求您使用调试信息构建DLL,并使主机可执行文件从DLL项目的输出路径加载DLL。

    你的实际问题听起来有点棘手。访问冲突可能在错误代码执行很久之后发生。要调试它,您可能首先确定引发异常的代码。该代码的哪一部分有一个可能无效的指针?然后追溯到DLL中可以修改该指针的任何内容。

    如果静态分析无效,那么您可以添加调试工具。你会想要:

    1. 启用范围检查以检测明显的缓冲区溢出。
    2. 完全FastMM调试以检测堆损坏,免费后访问等。
    3. mad除了为实际异常提供详细的诊断和堆栈跟踪。
    4. 您需要在所有模块中使用这些工具。