当前位置: 首页 > news >正文

百度站点管理出名的包装设计

百度站点管理,出名的包装设计,湖北省城乡建设厅证书查询,保定专业做网站的公司哪家好原文 帮助 有没有想过,如果运行时拥有调试器功能,会怎样? 对系统语言来说,常见问题是解引用空针.这几乎总是会导致崩溃,很难找到该问题,特别是你不是该项目的原始开发者时. 但是,不要害怕,在此我要讲如何在不需要实际附加调试器时获得有用的调试信息. 在Java中,已存在一个叫…原文 帮助 有没有想过,如果运行时拥有调试器功能,会怎样? 对系统语言来说,常见问题是解引用空针.这几乎总是会导致崩溃,很难找到该问题,特别是你不是该项目的原始开发者时. 但是,不要害怕,在此我要讲如何在不需要实际附加调试器时获得有用的调试信息. 在Java中,已存在一个叫NullPointerException的方法,它非常有用,因为它准确地显示了崩溃的内容,地点和时间,这就是本文要实现的目标. 检测崩溃(微软C运行时异常) 每当你的程序崩溃时,程序基本上都会退出,并返回一个负的错误码,或终止信号. 问题是,得不到有意义的错误消息,所以,唯一方法是附加一个调试器,但不是每次都可能,特别是随机发生该错误. 因此,先要检测崩溃,为此,使用Win32API来查找它: LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER );SetUnhandledExceptionFilter函数,参考地址 因此,此函数作用是,在类型运行异常时设置回调,即获得一些有关该异常的信息,如,上面显示的代码0xC..05. 第一个区别是,现在可决定是要继续运行还是处理此错误. 现在,进入回调部分: extern (窗口) LONG TopLevelExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo) {debug{//在D中,可调用throw来结束,因为它会自动为我们取栈跟踪throw new Exception(Caught Exception (0x~toHex(pExceptionInfo.ExceptionRecord.ExceptionCode)~));//但请继续阅读以了解如何手动取栈跟踪}//在此,可控制是否继续执行return EXCEPTION_CONTINUE_SEARCH; }访问可取错误码.用.而不是-. 取栈跟踪信息 在直接跳转到代码之前,还要包含2个系统库,这九分根据你的语言或构建系统,在D中,可直接从代码中包含库: debug version(窗口) {pragma(lib, psapi.lib);pragma(lib, dbghelp.lib); }//Windows也可在你的构建系统中用-Lpsapi-Ldbghelp来包含,直接放在代码中更清楚.应该放在默认库路径上. 现在,增加可用性的部分: extern (C) export void backtraced_Register() {debug{//初化.pdb读取进程SymInitialize(GetCurrentProcess(), null, true);//需要取有关文件的行信息SymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_DEBUG);SetUnhandledExceptionFilter(TopLevelExceptionHandler);} }现在,细节,分配一些内存来存储异常栈: debug void printStackTrace() {enum MAX_DEPTH 256;void*[MAX_DEPTH] stack;HANDLE process GetCurrentProcess();ushort frames RtlCaptureStackBackTrace(0, MAX_DEPTH, stack.ptr, null);SYMBOL_INFO* symbol cast(SYMBOL_INFO*) calloc((SYMBOL_INFO.sizeof) 256 * char.sizeof, 1);symbol.MaxNameLen 255;symbol.SizeOfStruct SYMBOL_INFO.sizeof;IMAGEHLP_LINEA64 line void;line.SizeOfStruct SYMBOL_INFO.sizeof;DWORD dwDisplacement;for (uint i 0; i frames; i){//从当前循环帧中取符号SymFromAddr(process, cast(DWORD64)(stack[i]), null, symbol);//取高级文件信息SymGetLineFromAddr64(process, cast(DWORD64)(stack[i]), dwDisplacement, line);//如果用C或D编程,你可能需要一个demangle函数.来更易阅读符号.此外,[0..symbol.NameLen]基本上是来创建一个区间.char[] funcName demangle(symbol.Name.ptr[0..symbol.NameLen]);auto fname line.FileName;auto lnum line.LineNumber;fprintf(stderr, %s:%i - %.*s\n, fname, lnum, cast(int)funcName.length, funcName.ptr);}free(symbol); }现在,有了它,可打印在UnhandledExceptionFilter中的栈跟踪,如下: 结果: Caught exception (0xC0000005) ------------------------------------------------------------------- G:\HipremeEngine\source\hip\systems\game.d:251 - hip::systems::game::GameSystem::addScene::__lambda2 G:\HipremeEngine\modules\util\source\hip\util\concurrency.d:307 - hip::util::concurrency::HipWorkerPool::addOnAllTasksFinished G:\HipremeEngine\modules\assets\source\hip\assetmanager.d:955 - hip::assetmanager::HipAssetManager::addOnLoadingFinish G:\HipremeEngine\source\hip\systems\game.d:257 - hip::systems::game::GameSystem::addScene G:\HipremeEngine\source\hip\systems\game.d:207 - hip::systems::game::GameSystem::startGame G:\HipremeEngine\source\app.d:238 - app::gameInitialize G:\HipremeEngine\source\app.d:214 - app::HipremeMain::__lambda4 G:\HipremeEngine\source\hip\global\gamedef.d:85 - hip::global::gamedef::loadDefaultAssets G:\HipremeEngine\source\app.d:218 - app::HipremeMain G:\HipremeEngine\source\app.d:296 - app::D main G:\HipremeEngine\source\app.d:296 - _d_run_main2 G:\HipremeEngine\source\app.d:296 - _d_wrun_main G:\HipremeEngine\tools\user\build_selector\D\ldc2-1.33.0-beta1-窗口-x64\import\core\internal\entrypoint.d:32 - app::wmain D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288 - __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288 - BaseThreadInitThunk D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288 - RtlUserThreadStart可见,得到了执行如何达到该异常的整个栈跟踪,这使你的程序现在更加可靠,特别是在新项目或DLL上处理其他人代码时. 附录:从DLL取栈跟踪 如果运行的是DLL,特别是在重新加载热代码的系统上,则无法取栈信息(是的,一旦初化异常处理器,它就可在可执行文件和dll代码之间工作). 要解决,你需要沿着dependency.dll文件加载依赖项.pdb,当然,在调试器中运行时都会发生,但是在调用LoadLibrary的独立可执行文件上时,不是这样. 为此,需要一些额外的代码,我叫它DebugLoadLibrary. void* DebugLoadLibrary(const char* libName) {import core.sys.windows.winbase;import core.sys.windows.windef;void* ret LoadLibrary(libName);debug{import core.sys.windows.psapi;MODULEINFO moduleInfo;GetModuleInformation(GetCurrentProcess(), ret, moduleInfo, MODULEINFO.sizeof);if(!SymLoadModuleEx(GetCurrentProcess(), null, libName, null, cast(ulong)moduleInfo.lpBaseOfDll, moduleInfo.SizeOfImage, null, 0)){throw new Error(format(Failed to load the DLL named , libName, pdb));}}return ret; }这样,如果DLL文件内部崩溃了,你会获得一些有用的信息(其栈跟踪),因此,可轻松调试它.
http://www.hkea.cn/news/14370746/

相关文章:

  • 传媒公司网站建设思路下载百度2024最新版
  • 济宁网站建设流程购物网站 怎么做
  • 上海网站建设seodian自定义wordpress后台
  • 电子商务网站建设与电子支付用二级页面做网站的源代码
  • 深圳哪些设计公司做网站比较出名网站建设接口开发
  • 企业网站建设找哪家俄罗斯军事新闻最新消息
  • 积极做好门户网站建设工作惠阳做网站公司
  • 织梦cms做多语言的网站什么是seo什么是sem
  • 统计网站建设企业管理咨询公司起名
  • 阿里巴巴吧做网站福州如何做百度的网站
  • 官方模板关键字生成的代码添加在网站的什么地方?东莞常平嘉华学校
  • 网站空间托管合同 .doc东莞市南华职业技术学校
  • 有什么网站是做办公家具做网站销售需要注意的
  • 无法连接到wordpress站点六安市民网
  • 都匀住房和城乡建设厅网站视频号直播怎么引流
  • 网站建设编辑教程室内设计网页
  • 河南餐饮网站建设盐田网站设计
  • 要建设网站成都装修设计公司排名
  • 做网站多少钱_西宁君博领衔竞价推广是什么意思
  • 夹江移动网站建设app软件下载站seo教程
  • python网站开发集成环境网站关键字设置
  • 贵州黔水建设股份有限公司网站邢台网上办事大厅
  • 专业外贸网站建设全网最稳最低价自助下单网站
  • 公司注册网站模板南昌地宝网租房个人房源
  • 湘潭网站设计祁阳seo
  • 建站最好的四川省建筑人才网
  • 网站开发属于软件开发公司网站 正式上线
  • 有没有做宠物的网站东莞建网站服务
  • 阿里云做网站可以免备案吗网站开发能作为无形资产吗
  • php做网站的支付功能免费网站统计