程序调试

WinDbg使用介绍

怎甘沉沦 提交于 2020-02-24 09:51:04
Windbg工作空间     WinDbg使用工作空间来描述和存储调试项目的属性、参数及调试器设置等信息。工作空间与vc中的项目文件很相似。WinDbg定义了两种工作空间,一种为默认工作空间,另一种为命名的工作空间。当没有明确使用某个命名空间时,WinDbg总是使用默认工作空间。   WinDbg在安装后就有预先创建了一些列默认空间。分别为基础工作空间、默认内核工作空间、默认远程调试工作空间、特定处理器工作空间、默认用户态工作空间。它们分别定义了在WinDbg在各种条件下的一些配置、参数设置等。   基础工作空间:当调试会话尚未建立,WinDbg处于闲置状态时,会使用此空间作为默认空间。   默认内核工作空间:当WinDbg开始内核调试,但是尚未与调试目标建立连接时,会使用此空间作为默认空间。   默认远程调试工作空间:当通过调试服务器进行远程调试时,会使用此空间作为默认空间。   默认的用户态工作空间:当使用WinDbg调试一个已运行的进程时,会使用这个空间作为默认工作空间。   当WinDbg打开一个应用程序开始调试时,调试器会 根据可执行文件的路径和文件名为其创建一个默认工作空间,如果已经存在工作空间,就使用已存在的。在WinDbg的文件菜单中可以使用另存为..创建一个命名的工作空间。 WinDbg的工作空间中保存了一下信息:   调试会话状态:包括,断点、打开的源文件

Windbg源码调试

两盒软妹~` 提交于 2020-02-24 08:55:32
Windbg提供比VS2008丰富很多的调试命令,尤其是调试多线程程序。 今天试着怎么使用源代码方式调试。为了说明调试命令,《C++标准库》一书里的例子做示范。 // testcast.cpp #include <stdio.h> #include <iostream> struct A { virtual void test() { printf_s("in A\n"); } }; struct B : A { virtual void test() { printf_s("in B\n"); } void test2() { printf_s("test2 in B\n"); } }; struct C : B { virtual void test() { printf_s("in C\n"); } void test2() { printf_s("test2 in C\n"); } }; void Globaltest(A& a) { try { C &c = dynamic_cast<C&>(a); printf_s("in GlobalTest\n"); } catch(std::bad_cast) { printf_s("Can't cast to C\n"); } } int main() { A *pa = new C; A *pa2 = new B; pa-

Windbg命令学习2(!sym和.reload)

泪湿孤枕 提交于 2020-02-24 08:51:21
以下示例以windbg加载calc.exe为例: 1 .!sym !sym 扩展控制显示详细的符号加载和符号提示。 .!sym : 不带参数表示显示当前的详细符号加载和符号提示的设置状态 给个示例: 0:001> !sym !sym <noisy/quiet - prompts/prompts off> - noisy mode - symbol prompts on 其实细心点可以看出sym的四种状态了, noisy / quiet - prompts /prompts off,所以我们要记这个命令的用法,就只要调用下!sym,就看到所有用法了.嘿嘿,我还比较聪明的 <>后面表示当前的设定状态, !sym noisy 激活详细符号加载(noisy symbol loading)显示。 给个示例: 0:001> !sym noisy noisy mode - symbol prompts on !sym quiet 禁止详细符号加载显示 0:001> !sym quiet quiet mode - symbol prompts on !sym prompts 当SymSrv 接收到认证请求时,允许弹出对话框。 0:001> !sym prompts quiet mode - symbol prompts on !sym prompts off

Windbg 离线调试.Net 程序入门

好久不见. 提交于 2020-02-24 08:50:22
在哪些情况下,必须祭出一些复杂的调试器呢?大概有以下: 程序异常崩溃 程序内存泄露 程序挂起 程序消耗cpu 高 内存泄露有.Net Memory Profiler神器情况下,能比windbg更容易找到问题(当然限于托管代码内存泄露,许多非托管的还是比较难搞). 参考 使用.Net Memory Profiler 分析.Net程序内存泄露 同样CPU监控工具也有ANT Profiler 之类工具. 但总有一些BUG难以重现,特别是在非开发机器出现,此时抓个dump,可能更为方便. 下面就以一个demo为例简单使用windbg 分析程序崩溃和挂起这两种情况. 异常的最佳实践 按照我的经验,很多代码反映出的是---不知道什么是异常,什么时候抛异常,什么地方捕获异常,或有日志,连个堆栈信息都看不到. 如何编写正确的代码才是,这应当才是问题的根源.再方便的调试的工具,耗费的时间也依然很多. 我很长时间用不上windbg是因为.NET程序调试太为简单了. 关于使用异常推荐一篇文章 http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET windbg 安装 下载安装后要配置symbol path 抓Dump 程序崩溃时弹出错误对话框之类.只要进程还没退出,也就是我们说”没飞”

Lua中的错误处理与调试类

僤鯓⒐⒋嵵緔 提交于 2020-02-24 05:29:41
一、错误处理 任何程序语言都需要有错误处理,以帮助我们更好的调试程序,程序中的错误类型主要有两种:语法错误和运行错误;语法错误会导致程序无法运行,但是它很简单,能够快速定位修复,而运行错误是程序可以运行,在运行时出错; 1.assert 断言,终止正在执行的函数,这是几乎每个语言都会提供的一个函数;在lua中,assert函数有两个参数,第一个参数,检查是否为true,如果是则不做任何事情,否则就会将第二个参数作为错误信息抛出; local t={1,2,3} local func = function(s) assert(type(s) == "string", "not string") print(s) end func(t) 2.error error函数终止正在执行的函数;error(msg, level),第一个参数为错误信息,第二个参数level为系统附加的一些错误信息,帮助定位错误; level默认为1,为调用error的位置(文件+行号);为0时不包含任何其它信息,为1时会指出调用error函数的函数; local t={1,2,3} local func = function(s) if type(s) ~= "string" then error("not string", 1) else print(s) end end func(t) 3.pcall

Atmel Studio 6使用

隐身守侯 提交于 2020-02-24 05:03:04
https://www.jb51.net/softs/556230.html Atmel Studio6也叫Avr Studio 6 ,是一款由Atmel公司开发的免费、集成化开发环境(IDE),可用来开发和调试基于Atmel ARM Cortex-M和AtmelAVR微控制器(MCU)的应用,Atmel Studio6提供了一个无缝、易用的环境,包含C/C++编译器、汇编器和模拟器,供用户编写、构建和调试采用C/C++或汇编代码编写的应用,还能与系统内的调试器和编程器无缝连接,进一步简化了代码开发,需要此款工具的朋友们可以前来下载使用。 Atmel Studio 6.2现已推出,新版增加了先进的调试功能(例如数据和中断跟踪),提高了RTOS集成,能够更好地调试已优化的代码,通过引入Atmel Gallery和Atmel Spaces两个模块,进一步简化了内嵌式MCU设计,减少了开发时间和成本。 Atmel Studio6使用教程 这里以GCC编译C语言编译一个8位的AVR为例,AVR Studio 6已经集成了AVR Toolchain,是最新版本3.4.0,不需要再安装WinAVR,也不需要再安装AVR toolchain。编译一个AVR时,需要做以下几件事,以AT90CAN128为例: 假设在新建项目时已经选择好了芯片AT90CAN128和工具,例如:JTEGMKII 1

给大家分享两款正在使用的reflector插件

你说的曾经没有我的故事 提交于 2020-02-22 19:13:58
 推荐两款神器:Deblector和reflexil   Deblector   它的名字是Debug 和 reflector 两个单词的结合。就是用来调试的。 简单的说,它可以像ide一样启动调试进程,或者Attach到一个运行中的进程,并调试他们,设置断点,单步运行,查看变量等等。 它不需要pdb文件,也不会像reflector pro的调试插件一样依赖ide,也不需要反编译dll。 一切工作仅在reflector内部完成,是不是很cool。 但缺点也是有的,那就是它只能在il级别调试。不过对于我们调试bug来说,这个基本已经足够了。   简单说一下这个插件的用法。安装到reflector后, tools菜单下会多一个Deblector菜单。   点开这个菜单,就可以打开这个插件了。 这时reflector的toolbar上会多出一些button。   这些button的意思就不多说了,自己看tooltip。   如果想启动一个新进程调试的话,可以把exe拖到reflector中, 然后点击toolbar上的第一个按钮,就是小三角,就可以自动启动这个exe并进入调试模式。   此时进程启动起来了,但是会在main函数的入口处断住,等待你的操作,这个时候你可以找到你想要设断点的方法,F9设置断点。   然后点击小三角或者F7继续运行程序。然后当程序走到断点的时候,就能断住了。  

常用的静态反调试技术及其规避方法

耗尽温柔 提交于 2020-02-22 08:25:50
静态反调试虽然容易绕过,但是由于种类繁多,如果病毒结合了很多种静态反调试而对其了解不多的话,也不好办,所以了解更多的 方法不至于束手无策. 1.利用PEB的BeingDebugged 字段   已知fs:[0x30]指向PEB, PEB地址+0x2 处的一个字节的数据表示是否在被调试,如果是1则是,0则不是   当进程被附加时,系统会将该值置为1 IsDebuggerPresent() API就是利用这个原理工作的: IsDebuggerPresent的反汇编代码: 751E9E0A mov eax,dword ptr fs:[00000030h] 751E9E10 movzx eax,byte ptr [eax+2] 751E9E14 ret 所以通过调试器启动后或附加后将该值修改为0即可规避 2.Ldr的内存区域特征 启动方式调试程序时,peb中的Ldr的内存是从堆中分配的,未使用的区域被大量填充0xfeeefeee.但附加方式却不会出现这种情况. 例如来到Ldr处(peb+0xc):这里测试Ldr地址是0x00241ea0 下拉: 通过附加的方式则不会出现这种特征. 此外,这种特征在xp以上的系统就没有了 3.Process Heap (peb+0x18) _heap结构节选:(xp sp3) 其中Flags和ForceFlags字段被调试时将不同 当正常运行时前者为0x2

在 .NET 程序中启用调试信息输出

不打扰是莪最后的温柔 提交于 2020-02-22 03:28:31
我们在开发当中,有时需要添加一些调试信息,以便在脱离集成调试环境时捕捉错误。Win32 编程常用 OutputDebugString 这个函数配合 DebugView 等工具来在程序中插入调试信息。为了将调试信息写入日志,也有很多方法和第三方工具,比如著名的 log4cxx。 .Net 平台下,我们只需要简单的调用 Trace 和 Debug 这两个类,即可实现大部分调试输出。 一、 Trace 和 Debug 的异同。 Trace 与 Debug 类均位于 System.Diagnostics. 我们在使用时,只需要引入该 namespace,同时在任何需要的地方直接调用即可。最大的区别在于,Debug 类仅在 Debug 模式下编译有效,而 Trace 类在 Debug 和 Release 模式下均可工作。例如这段代码: if (null == param1) { Debug.Fail("Debug: Parameter is null!"); // A return; } Trace.TraceInformation("Trace: Application Started!"); // B … 默认情况下,在 Debug 模式下编译,以上 A,B 两个均输出到调试环境中,比如,如果开启了DebugView,就可以看到类似如下的输出: Debug: Parameter is

VS.Net 2003调试您是服务器上“Debugger Users”组的成员的解决(转)

自作多情 提交于 2020-02-21 05:22:44
今天调一个ASP.NET的程序,老弹出"试图运行项目时出错: 无法在 Web 服务器上启动调试。您没有调试该服务器的权限。验证您是服务器上“Debugger Users”组的成员。"的信息,经过多次试验,最终的解决方案如下: 1.开始>计算机管理>本地用户和组>用户,在ASP.NET用户隶属组加多一个Administrators 2.IE>工具>Internet选项>受信站点,将http://localhost、http://计算机名、http://计算机ip、http://127.0.0.1统统加入到受信站点 3.IE>工具>Internet选项>受信站点>自定义级别>用户验证,选“使用当前用户名和密码登录” 。 ———————————————— 版权声明:本文为CSDN博主「flyingfz」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接: https://blog.csdn.net/flyingfz/article/details/1753427 来源: https://www.cnblogs.com/zhangshaojian/p/12340048.html