如何才能像 call stack 窗口一样的打印出调用栈?
我目前做的项目由于线程太多,经常出现子线程假死,所以我想通过随时打印出调用栈来方便调试。公司所用的 delphi 2010 可以这样做,但 delphi7 我不知道应该怎么才能得到调用栈

解决方案 »

  1.   

    需要引用TlHelp32,PSAPI
    首先枚举当前进程的线程ID,得到ID列表,2种方法
    1.CreateToolhelp32Snapshot,Thread32First,Thread32Next得到
    2.枚举TEB得到线程的ID列表后,循环用OpenThread打开,得到句柄,然后用GetThreadContext得到线程的上下文,
    上下文中TContext.Esp得到当前栈的地址,把这个值当作PDWORD,然后循环+4,判断PDWORD^这个值是否落在代码段区域,如果是,则90%的可能是调用返回地址.也可以全部打印出来.function OpenThread(dwDesiredAccess: DWORD; bInheritHandle: BOOL;
      dwThreadId: DWORD): THANDLE; stdcall;
      external kernel32 name 'OpenThread';dwDesiredAccess参数传
      THREAD_ALL_ACCESS           = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3FF;
      

  2.   


    很感谢你的回答,受教了。
    不过我想要的答案不是这样子。我希望列出调用栈的函数是原文,并且之前有线程ID,并能区分出是子线程还是主线程。刚刚我在查询资料中,得知 jcldebug, EurekaLog, Exceptional 可以做到~ 但在哪里下载,怎样安装又成了问题,我正在研究。
      

  3.   

    EurekaLog 可以实现你的要求  www.delphifans.com 和 Delphi盒子都有下载,有英文的帮助可以看!