今天在国际发展部出现一个奇怪的问题,拖动鼠标竟然调节了探头参数,而在自己的电脑始终没有出现这个问题,所以无法通过调试的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