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

名片型网站开发企业网站seo推广

名片型网站开发,企业网站seo推广,在线长图生成器,自适应网站如何做mip原文 帮助 有没有想过,如果运行时拥有调试器功能,会怎样? 对系统语言来说,常见问题是解引用空针.这几乎总是会导致崩溃,很难找到该问题,特别是你不是该项目的原始开发者时. 但是,不要害怕,在此我要讲如何在不需要实际附加调试器时获得有用的调试信息. 在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.tj-hxxt.cn/news/76716.html

相关文章:

  • 网站开发电脑配置要求东莞网站建设方案报价
  • 网站新年特效哪里可以接广告
  • 苏州网站建设客服百度q3财报2022
  • 做网站的的步骤怎么写惠州关键词排名提升
  • 网上代理 建网站关键字广告
  • 做数独网站能挣钱吗查关键词排名网
  • 网站底部图标代码网络公司网络推广
  • 建设单位企业锁登陆网站台州seo优化公司
  • 苏州做网站建设公司自媒体平台注册入口官网
  • 小公司如何做网站隔离百度seo排名查询
  • 360网站图标怎么做有网站模板怎么建站
  • 酒水包装设计公司百度seo通科
  • 怎么做刷业网站seo运营经理
  • h5游戏排行榜前十名铁力seo
  • 网站哪个语言好软文广告范文
  • 电子商务网站建设与管理读后感seo流量软件
  • wordpress图片采集插件北京seo推广系统
  • 怎样管理网站百度seo竞价推广是什么
  • 做经营性的网站需要注册什么深圳网络营销和推广渠道
  • 哪个网站可以免费做电子请柬杭州明开seo
  • 网站二维码代码运营网站
  • wordpress 文章title暴疯团队seo课程
  • 展览公司网站建设方案网站联盟
  • 药监局网站建设方案写软文是什么意思
  • 做网站付款方式培训心得体会2000字
  • 网站加速优化百度大搜推广开户
  • 动态网站开发属于哪种模式常见的营销方式有哪些
  • 长春直销网站开发百度搜索引擎优化详解
  • 百度站长反馈怎样推广品牌
  • 唐山如何做百度的网站郑州网站推广哪家专业