可怜,DELPHI这点的确做得不太好。
曾经我也被整得好惨。

解决方案 »

  1.   

    我服了!本来以为这是个小问题,应该有人能解决,现在看来,大家的办法比我想的还要复杂。真的没有人会吗?其实Delphi自身的源码我从来不改,所以根本没有必要跟踪到Delphi自己的过程和函数中去,可以设置这一功能吗?
      

  2.   

    我觉得可以有两种方案:
    1:在Delphi的环境选项中,在代码搜索路径的项目中,去掉VCL相关的文件,这样应该不会出现跟踪到VCL源码中的情况了。
    2:在Delphi定位的代码行(运行中断后)使用Call Stack功能,可以比较容易的选择你自己的函数,看看是哪一条语句出错。
      

  3.   

    To Sptan(学不会C++) :
    1.我试过了,根本不行;
    2.不知道你在说什么?
      

  4.   

    1.你的问题是内存泄漏。还是内存访问失败(引用了释放的指针)
    2.如果是内存泄漏,有专门的工具帮你定位memproof.用google搜索一下即可。
    3.最根本的解决办法是在编写任何一个函数或过程时都认真的主要内存的使用和释放。
    4.一般来说跟踪到VCL代码中对差错没有什么帮助。
    仅是个人意见。
      

  5.   

    呵呵,目前为止,除了Delphi的IDE, 我只看到两个软件做到你说的定型位到代码行的功能了,就是CheckBounder For Delphi,另一个是VssConnXtion, 这个插件的错误日志中能够记下错误所在的单元名和函数名,及行号. 但这两个软件都要在IDE中才行.至于在自己的应用程序中怎么做, 在下现在也还没找到, 不过, 程序出现异常时的栈信息好像是可以记下来的.
      

  6.   

    To Sptan(学不会C++) :
    1.我试过了,根本不行;
    2.不知道你在说什么?他是说的delphi的一个功能,可以告诉你函数的调用关系,或者说当他运行到vcl内部的语句停下来的时候你可以看到是那个函数调用的这条语句。一层一层的可以看到最早的一个函数,这样总有一个是你的了。
    这个功能就在那个可以看汇编源码的菜单旁边。你找找
      

  7.   

    呵呵,刚才仔细找一下,发现有个类库可以做到在运行时,定位到发生异常的程序行, 就是我前面说的VssConnXtion插件做到的那样. 但是,必须要在连接选项中选中Include TD32 debug info, 这可能会使用EXE文件增大一倍以上. 这套类库就是很有名的JCL. 它提供源码,且免费下载, 你自己Down回来看看吧.我也正在研究这部分.网址是:http://delphi-jedi.org/Jedi:CODELIBJCL
      

  8.   

    VssConnXtion哪儿有下载,我没找到,请给出具体的下载地址好吗?谢谢!
      

  9.   

    VssConnXtion哪儿有下载?我没找到。
      

  10.   

    VssConnXtion哪儿有下载?我找不到呀!
      

  11.   

    memproof可以,但效果不怎么好。我也一直在找这样的工具。
      

  12.   

    to  huangcf(huangcf) :
    呵呵,可到 http://www.epocalipse.com/download.htm 去下载! 这个插件感觉用起来还不错,不过可惜是要注册的,可免费使用一个月.你还是去Down个JCL来看吧,这套类库做的还可以,特别是它对调试信息的支持比较好!它在运行时得到类似下面的信息:
    [0046A09B] SourceLocDemoMain.TForm1.CallerBtnClick (Line 75, "SourceLocDemoMain.pas" + 1) + $10即,能定位到具体的代码行!!只要你出异常时,把这个信息写入日志, 或者用它你还可能把当时详细的栈信息记下来,如:[0046A188] SourceLocDemoMain.TForm1.StackBtnClick (Line 95, "SourceLocDemoMain.pas" + 4) + $20
    [0043BD86] Controls.TControl.Click + $6A
    [0043EA7C] Controls.TWinControl.WndProc + $15C
    [0043EBB4] Controls.DoControlMsg + $28
    [0043EA7C] Controls.TWinControl.WndProc + $15C
    [0043E6F7] Controls.TWinControl.MainWndProc + $2F
    [00421F9A] Classes.StdWndProc + $16
    [0043EB60] Controls.TWinControl.DefaultHandler + $DC
    [0043EA7C] Controls.TWinControl.WndProc + $15C
    [00421F9A] Classes.StdWndProc + $16
    [0046A5C0] SourceLocExample.initialization + $40有了这些信息,相应对你找BUG是有很大帮助了的!!
      

  13.   

    我Down了JCL,也全部安装好了,但不知道怎么用呀!怎样做才出现你所说的那些信息,请告诉详细的步骤好吗?
      

  14.   

    呵呵,你可以看JCL带的例子呀,我上面的信息是从例子程序运行时的界面的中Copy出来的. 方法是,你打开安装目录下,examples子目录下的JclExamples.bpg, 然后,Ctrl + Alt + F11打开项目管理器,在中间双击SourceLocExmple.Exe, 然后按Ctrl + Shift + F11在Linker页面中选中Include TD32 Debug info, 确定后, 按F9运行! 所有的例子都在JclExamples.bpg中,你可以一一编译运行它们, 其中还包括了几个很有用的工具的.关于VssConnXion插件,是用来在Delphi IDE中引入VSS(Microsfot Visual SourceSafe)功能的,使Delphi能像VC一样与VSS紧密结合起来. 
      

  15.   

    JCL的范例我运行过了,确实有代码行定位的功能,但对我帮助不大,因为我的程序是出错的,而且随机出现,跟按一个按钮出现一行提示是不同的。对于VssConXion,我是安装上了,但对不起,我还是不知道该怎么使用,Visual SourceSafe我也不会使用,而且我没有Visual Sourcesafe。
      

  16.   

    呵呵,你怎么不明白呀,你程序的异常处理中加入写日志功能, 使用JCL提供的功能能将详细的信息记下来呀!!一般情况下,未经你处理过的随机的异常最后会来到 你可以在Application的OnException事件中,所以你只要在这个事件中取得发生异常的详细信息记下来就可能大概判断Exception是哪里产生的了呀!你好好看看StackTrackExample这个项目吧, 也是选中TD32 Debug Info后编译.当然,好像也并不是所有的异常都会到Application的OnException事件中,但绝大多数是可以到这里的.
      

  17.   

    呵呵,关于VSS, 这是Visual Studio中的一个组件, 用来软件版本管理及源码管理的,功能强大,也很好用, 它与VC可以很紧密的结合. Delphi中装上VssConnXion后,也可以与VSS紧密结合起来.你可以装一个VSS试试呀! 不过, 这也没有什么中文资料给你, 你自己读帮助吧!我只所以提到VssConnXion插件,是因为我发现它在发生异常时写的日志文件比较好, 它能定位到发生异常的代码行,而且它能捕获到Delphi IDE的异常. 不过,现在它的2.1版好像是不在写这种日志了.