delphi7 如何在程序中,得到调用栈; 如何才能像 call stack 窗口一样的打印出调用栈?我目前做的项目由于线程太多,经常出现子线程假死,所以我想通过随时打印出调用栈来方便调试。公司所用的 delphi 2010 可以这样做,但 delphi7 我不知道应该怎么才能得到调用栈 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要引用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; 很感谢你的回答,受教了。不过我想要的答案不是这样子。我希望列出调用栈的函数是原文,并且之前有线程ID,并能区分出是子线程还是主线程。刚刚我在查询资料中,得知 jcldebug, EurekaLog, Exceptional 可以做到~ 但在哪里下载,怎样安装又成了问题,我正在研究。 EurekaLog 可以实现你的要求 www.delphifans.com 和 Delphi盒子都有下载,有英文的帮助可以看! 入手单片机网口通讯,Delphi网络方面比较菜,请问如何入手? 救命啊!!!!各位大哥哥大姐姐救救我啊!!! WIN98下关机画面能否DIY? 谁那里有关于installshield6.22的安装说明?? 谁有串口通讯的控件,给俺copy一份,能用立即给分 MIDAS自动注册到操作系统里的信息如何清除? 请问:为什么不能insert/delete?先谢了。 关于新FORM的缺省值 用ADO为什么会这样?粘自我上次发的贴子,没有解决 怎么提取显示的东西和源代码是一样的网址的数据。 问个dbgrid比较弱智的问题 新人求教EHLIB 过滤问题
首先枚举当前进程的线程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;
很感谢你的回答,受教了。
不过我想要的答案不是这样子。我希望列出调用栈的函数是原文,并且之前有线程ID,并能区分出是子线程还是主线程。刚刚我在查询资料中,得知 jcldebug, EurekaLog, Exceptional 可以做到~ 但在哪里下载,怎样安装又成了问题,我正在研究。