2013年2月18日
摘要: 为了跟踪错误,经常需要获取程序中各线程的函数调用栈信息,通过函数 StackWalk 来获取。BOOL WINAPI StackWalk64( __in DWORD MachineType, __in HANDLE hProcess, __in HANDLE hThread, __inout LPSTACKFRAME64 StackFrame, __inout PVOID ContextRecord, __in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, __in_opt P... 阅读全文
posted @ 2013-02-18 12:06 布丁嫩 阅读(916) 评论(0) 推荐(0) 编辑
  2013年1月30日
摘要: 前段日子调试dump文件的时候遇到一个问题:生成的64位进程的dump文件,换台机子后打开该dump文件,调用堆栈显示异常,32位程序不存在这种情况问题是这样:我在64位winsrv2003上用的X64配置编的测试exe,内容为在程序内抛出异常,并通过SetUnhandledExceptionFilter设置异常处理函数,在该函数内通过调用dbghelp.dll的MiniDumpWriteDump生成dump文件。在本机执行生成dump文件(a.dmp),拖到vs10里面可以打开,看到详细的函数调用栈信息,当我把exe,pdb以及a.dmp文件拷到其他64位机器(一台64位win7)下,将a. 阅读全文
posted @ 2013-01-30 18:50 布丁嫩 阅读(1253) 评论(0) 推荐(0) 编辑
  2013年1月17日
摘要: 生成静态库 若当前已有以下.o文件:obj1.o obj2.o 则gcc指令如下: ~$ar -rsv libtest.aobj1.o obj2.o ranlib指令:来对静态库的符号索引表进行更新 ~$ranliblibtest.a 注:linux下生成静态库.a文件有一个命名规则,必须 lib 开头 .a 结尾, 即 libXX.a使用静态库 1.使用路径,如 ~$g++ test.o ./libtest.a -o test.out 若还依赖其他目录下的库,则也用这种绝对路径方式链接,如 ~$g++ test.o ./libtest.a /usr/local/li... 阅读全文
posted @ 2013-01-17 13:38 布丁嫩 阅读(7483) 评论(0) 推荐(0) 编辑
摘要: 强力 调试 工具 windbg:1. 到windbg官网下载安装文件http://www.windbg.org/2.选择下载32bit or 64bit 版本:我的经验:我们的编译机环境和运行机环境一致,都为winserver2003 sp2 64bit,因为是在运行机上安装,所以下载64bit版本详见:Choosing the 32-Bit or 64-Bit Debugging Tools3.下载windbg符号库文件(若机子有联网,可不用下载符号库)根据环境下载,详见:Download Windows Symbol Packages4.安装windbg和符号库(若机子有联网,可不用安装符 阅读全文
posted @ 2013-01-17 11:54 布丁嫩 阅读(1071) 评论(0) 推荐(0) 编辑
摘要: 如进入 e:/test1/test2cd/e:cd test1/test2这时候在 start 就可以了 阅读全文
posted @ 2013-01-17 11:17 布丁嫩 阅读(2972) 评论(0) 推荐(0) 编辑
  2013年1月7日
摘要: 在Windows下_WIN32Defined for applications for Win32 and Win64. Always defined._WIN64Defined for applications for Win64. 来源:predefined macros 可以使用 _WIN32 来辨别是否为 Windows 系统Linux下: 在终端下运行: $cpp -dM /dev/null 可以打印出所有gcc预定义的宏 一般我们使用 __linux__ 来辨别是否为 linux 系统 阅读全文
posted @ 2013-01-07 16:17 布丁嫩 阅读(310) 评论(0) 推荐(0) 编辑
  2013年1月6日
摘要: dbghelp.dllwindows的系统目录system32下,都有dbghelp.dll,但在实际使用时,往往会让exe加载自己目录下的dll,以避免系统目录下的dll版本不一导致的程序异常。故一般都是用LoadLibrary()的方式加载Dll,先加载当前目录,不存在时加载系统目录。HMODULE hDll = ::LoadLibrary(szDllPath);MiniDumpWriteDump该函数为DbgHelp.dll 导出函数,使用它生成dump文件。BOOL WINAPI MiniDumpWriteDump( __in HANDLE hProcess, __in DWO... 阅读全文
posted @ 2013-01-06 14:25 布丁嫩 阅读(1313) 评论(0) 推荐(0) 编辑
摘要: LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( __in LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); 设置异常捕获函数.当异常没有处理的时候,系统就会调用SetUnhandledExceptionFilter所设置异常处理函数. 即:执行代码引起的异常或者代码throw出的异常,没有对应的catch代码时,便会由该函数处理。 这是进程内最后一次处理异常的机会,默认函数的不做处理,引发异常,结束进程。LONG WINAPI Unhandled.. 阅读全文
posted @ 2013-01-06 13:51 布丁嫩 阅读(1693) 评论(0) 推荐(0) 编辑
  2012年12月28日
摘要: 常见的 try,catch,throw 用法就不说了,介绍以下:set_terminate当throw的异常类型找不到适当的catch时,就会调用terminate()函数,默认的terminate函数中调用abort()函数结束程序;可以使用set_terminate()来改变默认的terminate()函数;如:void terminate_my (){ cout << "terminate_my" << endl; abort();}int main(){ terminate_handler old_handle = set_terminate 阅读全文
posted @ 2012-12-28 14:27 布丁嫩 阅读(401) 评论(0) 推荐(0) 编辑
  2012年12月27日
摘要: 基本上可以参考 百度百科:http://baike.baidu.com/view/517185.htm下面简单拿几个例子介绍下:char * psz1 = "%%"; // 全角 ASCIIchar * psz2 = "%%"; // 半角 ASCIIwchar_t * pwsz1 = "%%"; // 全角Unicodewchar_t * pwsz2 = "%%"; // 半角Unicode调试可以得出:psz1: 0xA3 0xA5 0xA3 0xA5psz2: 0x25 0x25pwsz1:0xFF05 0x 阅读全文
posted @ 2012-12-27 20:28 布丁嫩 阅读(317) 评论(0) 推荐(0) 编辑