关于消息反射及thiscall&stdcall.txt (MemoryLeak)

MFC中消息反射是通过调用子类的虚函数来实现的,
Atl的消息反射是通过查来消息反射表来实现的(这个表用宏来生成)
 
MFC中__stdcall 到 thiscall的方法是采用 TLS(thread local storage),根据HWND 查找到CWND* (Fromhandle); 因此为了尽早地创建CWnd类实例,
需要采用进程内Hook技术钩住WM_CREATE(CBT HOOK), 在Hook的WM_CREATE中new CWND并放到TLS中(以MAP形式),然后取消HOOK. AfxWndProc -> CWnd::WindowProc
 
Atl中__stdcall 到 thiscall的方法是采用thunk, 将消息处理函数中第一个参数HWND转为CWND*(thunk中存有this指针,当第一个消息WM_CREATE来时,
当前最初消息处理函数CWindowImplBaseT< TBase, TWinTraits >::StartWindowProc将thunk作为消息处理函数设给窗口,之后最初消息处理函数不再起作用,当thunk函数执行的时候
将这个this move到HWND的内存位置,然后再跳至中介消息处理函数CWindowImplBaseT< TBase, TWinTraits >::WindowProc, 在中介消息处理函数再强制转化HWND为CWND*, 
然后调用成员消息处理函数(thiscall)ProcessWindowMessage. )
 
 
WinDBG 查不出Debug模式的泄漏,但是对Debug模式的Stack Backtrace 支持很好。
WinDBG 可以查出所有Release下的泄漏,但是无法定位源码
DebugDiag 通过rule可以定位Release下的泄漏到代码行及调用堆栈(需要gflags支持)
DebugDiag rule debug只能定位到行, 没有call stack
DebugDiag full dump能定位到行, 没有call stack; mini dump不能分析. (debug & release, 需要先track)
 
#include <crtdbg.h>
#ifdef _DEBUG 
#define new  new( _CLIENT_BLOCK, __FILE__, __LINE__) 
#endif 
 
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
 
Detect Memory Leak:
1. DebugDiag:
use Leak memory/handle rule(can get the line num which alloc memory)
use Processes View and then select "monitor leaks" item from popup menu
 
2. use vc: 
_Crt*** series functions;
MFC debug mode
 
3. use windbg:
!heap -l; dt _dph_block_information;  dds xxxxx  (normal page heap)
umdh -pn:Process.exe -f:D:\filename.log   (_NT_SYMBOL_PATH, 对release支持不大好)
!heap -x xxxx; !heap -p -a xxxx2 (xxxx2 is heap entry)
 
 
Detect CLR Leak:
1. perfmon (private and virtual bytes)
2. .loadby sos mscorwks
 
 
Detect Handle Leak:
1. DebugDiag
2. !htrace -enable !htrace -snapshot; !htrace -diff; lsa xxxx (Enable application verifier)
 
 
Detect GDI Leak:
1. taskmgr
2. GdiLeakDetector.exe(GdiSpy.dll)
3. GdiUsage.exe(GDITrace.dll)
4. GDIndicator.exe(GDInject.dll)
 
 
Performance Analyze:
1. perfmon (process)
2. vc2005 performance tools
 
Code Analyze:
1. vc2005 project property
 

你可能感兴趣的:(关于消息反射及thiscall&stdcall.txt (MemoryLeak))