MFC实现类似callstack功能

今天在国际发展部出现一个奇怪的问题,拖动鼠标竟然调节了探头参数,而在自己的电脑始终没有出现这个问题,所以无法通过调试的callstack来看究境哪里调用。初步想了下,正常就没有调用到调节参数的那个函数那里,难道程序哪里还有什么隐藏的BUG,不知不觉哪里调用了,由于这是一个消息响应函数,在很多地方都调用了,所以需要找到究境是哪里调用了这个函数。所以想RELEASE下是否也可以实现callstack的功能,在网上找了一圈,发现资料比较少,还好找到了。

1.包含的头文件

//shejn 2018/01/04 16:01:49 打印堆栈信息 link包括库中增加dbghelp.lib,并把c:\windows\system32kernel32.dll拷贝过来
#include <DbgHelp.h>
#include "Windows.h"
#include "WinBase.h"
#pragma comment(lib,"Kernel32.lib")
typedef USHORT (WINAPI *CaptureStackBackTraceType)(__in ULONG, __in ULONG, __out PVOID*, __out_opt PULONG);
CaptureStackBackTraceType func = (CaptureStackBackTraceType)(GetProcAddress(LoadLibrary("kernel32.dll"), "RtlCaptureStackBackTrace"));
2.输出堆栈函数
void  printStack( void )  //shejn 2018/01/04 16:01:49 打印堆栈信息
{  
	unsigned int   i;  
	void         * stack[ 100 ];  
	unsigned short frames;  
	SYMBOL_INFO  * symbol;  
	HANDLE         process;  

	process = GetCurrentProcess();  

	SymInitialize( process, NULL, TRUE );  

	frames               = /*CaptureStackBackTrace*/(func)( 0, 100, stack, NULL );  
	symbol               = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );  
	symbol->MaxNameLen   = 255;  
	symbol->SizeOfStruct = sizeof( SYMBOL_INFO );  

	for( i = 0; i < frames; i++ )  
	{  
		SymFromAddr( process, ( DWORD64 )( stack[ i ] ), 0, symbol );  

		TRACE( "printStackTest:%i: %s - 0x%0X\n", frames - i - 1, symbol->Name, symbol->Address );  
		
	}  

	free( symbol );  
} 
3.在自己的需要跟踪的函数里调用这个函数即可。
最后的输出的结果类似于

16:07:44:739 printStackTest:28: printStack - 0x38EDB0


16:07:45:128 printStackTest:27: CFftView::OnDopParamChange - 0x38EEC0


16:07:45:130 printStackTest:26: CFftView::OnDopParamChange - 0x38EEC0


16:07:45:132 printStackTest:25: CFftView::OnDopParamChange - 0x38EEC0


16:07:45:135 printStackTest:24: CFftView::OnDopParamChange - 0x38EEC0


16:07:45:136 printStackTest:23: CFftView::OnDopParamChange - 0x38EEC0


16:07:45:139 printStackTest:22: CFftView::OnDopParamChange - 0x38EEC0


16:07:45:141 printStackTest:21: gapfnScSendMessage - 0x7594C318


16:07:45:143 printStackTest:20: gapfnScSendMessage - 0x7594C318


16:07:45:145 printStackTest:19: GetScrollBarInfo - 0x75944E11


16:07:45:148 printStackTest:18: GetScrollBarInfo - 0x75944E11


16:07:45:150 printStackTest:17: KiUserCallbackDispatcher - 0x774E6FC0


16:07:45:152 printStackTest:16: SendMessageA - 0x7593AD60


16:07:45:346 printStackTest:15: CFftWnd::OnLClickBmpCtrl - 0x3A8570


16:07:45:348 printStackTest:14: CFftWnd::OnLClickBmpCtrl - 0x3A8570


16:07:45:349 printStackTest:13: CFftWnd::OnLClickBmpCtrl - 0x3A8570


16:07:45:351 printStackTest:12: CFftWnd::OnLClickBmpCtrl - 0x3A8570


16:07:45:353 printStackTest:11: CFftWnd::OnLClickBmpCtrl - 0x3A8570


16:07:45:356 printStackTest:10: CFftWnd::OnLClickBmpCtrl - 0x3A8570

参考文档链接:https://stackoverflow.com/questions/590160/how-to-log-stack-frames-with-windows-x64

猜你喜欢

转载自blog.csdn.net/shejiannan/article/details/78972868