【问题标题】:How do I debug a stack overflow?如何调试堆栈溢出?
【发布时间】:2012-10-29 10:37:33
【问题描述】:

我想知道是否有人有过类似的经历。我正在尝试追踪问题的根源,但我想出了 nil。我在 Delphi 5 中有一个项目,其中包含 Report Builder 报告。我需要升级版的报告生成器,所以我尝试在 Delphi 7 中运行该项目。当我的项目运行并单击按钮查看报告时,它可以正常查看。但是,如果我使用 paramstr 运行报告(showmainform 设置为 false)并显示报告过程运行,我会收到堆栈溢出错误。

原来的代码是:

 if lowercase(ParamStr(1)) = 'termsexceeded' then begin
    reportsdata.termsexceeded.close;
    reportsdata.termsexceeded.open;
    reports.ppTermsExceeded.print;
    reportsdata.termsexceeded.close;
    application.terminate;
  end; 

它给了我 .print 函数的堆栈溢出错误。

在 Delphi 7 中工作的代码是:

 if lowercase(ParamStr(1)) = 'termsexceeded' then begin
    reportsdata.termsexceeded.close;
    reportsdata.termsexceeded.open;
    reports.left := -10000;
    reports.show;
    reports.ppTermsExceeded.print;
    reportsdata.termsexceeded.close;
    application.terminate;
  end; 

有没有人建议我如何调试它以查看问题出在我的 Delphi 7 还是 Reportbuilder 上?

报告表单的 .show 事件中没有事件。

任何关于如何深入了解此问题的建议将不胜感激。

问候

【问题讨论】:

  • 顺便说一句,为什么需要设置reports.left := -10000;
  • 保存报告的表单是空白表单,因此看起来很不整洁,所以我将其设置在用户视线之外。
  • 这段代码在哪里?什么调用它?它在主 .dpr 文件中吗?
  • 此代码位于应用程序的主窗体中,但报表组件位于报表窗体中

标签: delphi delphi-7 stack-overflow delphi-5 reportbuilder


【解决方案1】:

当您遇到堆栈溢出时,请使用调试器。当操作系统抛出异常时,它将中断您的程序,此时,您可以使用调试器的调用堆栈窗口查看函数调用的路径。您可能会看到某个函数或函数序列重复了很多次。

找到重复模式后,请检查代码以了解其重复的原因。查找应该已更改但没有更改的条件。

【讨论】:

  • 谢谢,我确实尝试过,但是它进入的每个代码 sn-p 似乎都在重复出现,我删除了(每次删除一个违规单元时,都会发生另一个),直到没有更多但实际的打印程序。我现在只需要显示该表格并且没有任何麻烦,只是想要一个明确的原因以及错误。
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2011-08-05
  • 1970-01-01
  • 2015-02-13
  • 2021-05-26
相关资源
最近更新 更多