JCLDebug堆栈跟踪缺少导致错误的实际代码行

awm*_*oss 3 delphi

我正在使用JCLDebug在DUnit中显示堆栈跟踪(单击此处获取更多信息).请参阅下面的堆栈跟踪.

堆栈跟踪显示所有呼叫到函数调用导致错误的实际功能.ConvertScriptTestU的第238行调用另一个名为"GetDataLine"的函数(它从堆栈跟踪中丢失)然后调用IntToStr(它引发EConvertError).为什么堆栈跟踪不包含GetDataLine

这个堆栈跟踪没那么有用,因为我仍然要弄清楚GetDataLine中的哪一行导致了EConvertError.

我在这里使用DUnit但是我看到在DUnit之外使用JclDebug时会发生同样的事情.

[答案]

只需将此行添加到项目文件中:

JCLdebug.JclStackTrackingOptions:=[stStack, stRawMode];
Run Code Online (Sandbox Code Playgroud)

它打开"原始模式".您可能还需要调整一些编译器选项(例如'生成堆栈帧')

[/答案]

TestConversion: EConvertError
at SysUtils:0 SysUtils.ConvertErrorFmt$00414A7E
'''' is not a valid integer value
StackTrace
[00414A79]{ConvertDataTests.exe} SysUtils.ConvertErrorFmt
[007E2699]{ConvertDataTests.exe} ConvertScriptTestU.ConvertDataTest.WriteDataToFile (Line 238, "ConvertDataTestU.pas")
[007E2198]{ConvertDataTests.exe} ConvertScriptTestU.ConvertDataTest.TestConversion (Line 164, "ConvertDataTestU.pas")
[0053C66E]{ConvertDataTests.exe} TestFramework.TTestCase.RunTest (Line 2380, "TestFrameWork.pas")
[00537DBA]{ConvertDataTests.exe} TestFramework.TTestResult.RunTestRun (Line 1199, "TestFrameWork.pas")
[00538078]{ConvertDataTests.exe} TestFramework.TTestResult.Run (Line 1275, "TestFrameWork.pas")
[0053963A]{ConvertDataTests.exe} TestFramework.TAbstractTest.RunWithFixture (Line 1723, "TestFrameWork.pas")
[0053C4DD]{ConvertDataTests.exe} TestFramework.TTestCase.RunWithFixture (Line 2363, "TestFrameWork.pas")
Run Code Online (Sandbox Code Playgroud)

小智 7

它可能取决于您编译应用程序的方式.出于调试目的,您应该在编译器代码生成选项中将Stack Frames设置为On,并确保重新编译所有需要的单元,并且它们的符号可用.否则,编译器可能会选择不为某些函数生成它们.手动编码的纯汇编程序函数无论如何都可能没有堆栈帧,IIRC.如果在支持该功能的Delphi版本中内联函数,则可能会出现另一个问题.另外,您在JCL调试中设置了哪种堆栈跟踪?IIRC它支持两种方法,标准和"原始".

  • 是! 将堆栈跟踪设置为"raw"给了我完整的堆栈跟踪.我添加了一行"JCLdebug.JclStackTrackingOptions:= [stStack,stRawMode];" 到我的DUnit项目文件,现在它的工作原理. (2认同)