读书人

delphi7 怎么在程序中得到调用栈

发布时间: 2012-12-14 10:33:08 作者: rapoo

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;


[其他解释]
奇怪了,为啥木有人回答呢
[其他解释]

引用:
需要引用TlHelp32,PSAPI
首先枚举当前进程的线程ID,得到ID列表,2种方法
1.CreateToolhelp32Snapshot,Thread32First,Thread32Next得到
2.枚举TEB

得到线程的ID列表后,循环用OpenThread打开,得到句柄,然后用GetThreadContext得到线程的上下文,
上下文中TContext.Esp得到当前栈的地……


很感谢你的回答,受教了。
不过我想要的答案不是这样子。

我希望列出调用栈的函数是原文,并且之前有线程ID,并能区分出是子线程还是主线程。

刚刚我在查询资料中,得知 jcldebug, EurekaLog, Exceptional 可以做到~ 但在哪里下载,怎样安装又成了问题,我正在研究。
[其他解释]
该回复于2012-10-22 08:46:09被版主删除

读书人网 >.NET

热点推荐