我正在使用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它支持两种方法,标准和"原始".