delphi7 如何在程序中,得到调用栈;
如何才能像 call stack 窗口一样的打印出调用栈?
我目前做的项目由于线程太多,经常出现子线程假死,所以我想通过随时打印出调用栈来方便调试。
公司所用的 delphi 2010 可以这样做,但 delphi7 我不知道应该怎么才能得到调用栈
[最优解释]
EurekaLog 可以实现你的要求 www.delphifans.com 和 Delphi盒子都有下载,有英文的帮助可以看!
[其他解释]
需要引用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;
[其他解释]
奇怪了,为啥木有人回答呢
[其他解释]