Visual Studio 调试常用20个小技巧

x64dbg调试程序遇到异常:406D1388,MS_VC_EXCEPTION. E06D7363, CPP_EH_EXCEPTION x64dbg调试某个程序遇到异常:第一次异常于00007FFA2EDDA839 (406D1388, MS_VC_EXCEPTION)!无视异常继续运行,加载一些dll文件后还是断在kernelbase.dll的00007FFA2EDDA839处,不过括号里面的内容变成了(E06D7363, CPP_EH_EXCEPTION). 这可能是某种反调试的技术吧,在x64dbg中选择 调试 > 高级 > 隐藏调试器(PEB),便不会出现异常,能正常调试了。如果遇到反调试技术更强的软件,... 阅读详情

技巧1: 异常中断

在处理被调用之前,异常发生时可以启动调试器进行中断,可以让你在异常发生后立即调试程序。操作调用栈便于你去查找异常发生的根本原因。

Vistual Studio允许你去指定想要中断的异常类型或者特殊异常。选择菜单Debug>Exceptions弹出对话框,你可以指定原生的(或者托管的)异常,除了调试器自带的一些默认异常,你还可以添加自己的自定义异常。

下面是一个std::exception 异常抛出时调试器中断的例子。

更多阅读:

·        1.  异常抛出时如何中断

·        2.  如何添加新的异常

 

技巧2:Watch窗口中的伪变量

Watch窗口或QuickWatch对话框提供一些特定的(调试器可识别的)变量,被称为伪变量。文档包含以下:

·        $tid—–当前线程的线程ID

·        $pid——进程ID

·        $cmdline———-启动程序的命令行字符串

·        $user———-正在运行程序的账户信息

·        $registername—–显示寄存器registername 的内容

不管怎么样,关于最后一个错误的伪变量是非常有用的:

·        $err——–显示最后一个错误的错误码

·        $err,hr—显示最后一个错误的错误信息

更多阅读:伪变量

 

技巧3:符合越界后查看堆对象

有时候,在调试符号越界后,你还想查看对象的值,这个时候,watch窗口中的变量是被禁用的,不能再查看(也不能更新),尽管对象仍然存在。你如果知道对象的地址,可以继续充分地观察它。你可以将地址转换为该对象类型的指针,放在watch窗中。

下面的例子中,当单步跳出do_foo()之后,_foo不能再被访问。但是,将它的地址转换为foo*后,就可以继续观察这个对象。

 

技巧4:查看数组的值

如果你在操作一个很大的数组(我们假设至少有几百个元素吧,但是可能更少),在Watch窗口中展开数组,查找一些特定范围内的元素很麻烦,因为你要不停地滚动.如果数组是分配在堆上的话,你甚至不能在watch窗口中展开数组元素.对此,有一个解决办法。你可以使用(array+ <offset>),<count> 去查看从<offset>位置开始的特定范围的<count>元素(当然,这儿的数组是你的实际对象)。如果想查看整个数组,可以简单使用array,<count>.

如果你的数组是在堆上,你可以在watch窗口中将它展开,但是要查看某个特定范围的值,用法稍有不同:((T*) array + <offset>),<count>(注意这种用法对于堆上的多维数组也有效)。但是这种情况下,T是指数组元素的类型。

如果你在用MFC,并使用其中的’array’容器,像 CArray, CDWordArray,CStringArray等等。你当然可以使用同样的过滤方法。除此之外,你必须查看array的m_pData成员,它是保存数据的真实缓存。

 

技巧5:避免进入不必要的函数

很多时候,你在调试代码时可能会进入到你想跳过的函数,像构造函数,赋值操作或者其他的。其中最困扰我的是CString构造函数。下面是一个例子,当你准备单步执行take_a_string()函数时,首先进入到CString的构造函数。

1

2

3

4

5

6

7

8

void take_a_string(CString const &text)

{

}

 

void test_string()

{

   take_a_string(_T("sample"));

}

幸运的是可以告诉调试器去跳过哪些方法,类或者整个命名空间。实现它的方法也已经改变了,回到使用VS6的日子,通常是通过autoexp.dat文件来指定的。Vistual Studio 2002改成了使用注册表设置。想要跳过一些函数,你需要在注册表里添加一些值(详情如下):

1.      实际位置取决于你使用的Vistual Studio版本和操作系统平台(x86或x64,因为注册表只能在64位的Windows下浏览)

2.      值的名字是数字,代表规则的优先级;数字越大,优先级越高。

3.      值数据是一个正则表达式的REG_SZ值,用于指定怎样过滤和执行。

为了避免进入任何CString方法,我添加了下面的规则:

 

有了这个,即使你强制进入上例中的take_a_string(),调试器也会跳过CString的构造函数。

更多阅读:

·         使用Visual C++调试器怎样避免进入函数

·        使用AutoExp.dat调整调试器

技巧6:从代码启动调试器 Launch the debugger from code

你可能很少需要将调试器附加到程序中,但你不能在Attach窗口这样做(可能因为中断发生太快而没有捕获到),你也不能一开始就在调试器中启动程序。你可以在程序中产生中断给调试器一个机会通过调用内部的_degbugbreak()来附加。

1

2

3

4

void break_for_debugging()

{

   __debugbreak();

}

实际上还有其他的方法来完成,例如触发中断3,但这仅仅适用于x86平台(C++64位不再支持ASM)。另外还有DebugBreak()函数,但它的使用不怎么简便,所以这里推荐使用内部方法。

1

__asm int 3;

   程序运行内部方法时会停止运行,这时你就有机会将调试器附加到该进程。

 

 

 

更多阅读:

·         内部方法_debugbreak

·        任何时候都离不开设置断点和断言

·        Visual Studio 20005/2008的调试,第四部分:为调试器设置代码

技巧7:在output窗口打印

通过调用DebugOutputString可以在调试器的output窗口显示一段特定的文本。如果没有附加的调试器,该函数什么也不做。

 

更多阅读:

·        函数OutputDebugString

·        函数OutputDebugString的调用机制

技巧8:隔离内存泄漏

内存泄漏是在原生开发中的一个很重要的问题,要检测内存泄漏是一个很严峻的挑战,尤其是在大型项目中。Vistual Studio可以提供检测内存泄漏的报告,还有其他的一些应用程序(免费的或商业的)也可以帮助你检测内存泄漏.有些情况下,在一些内存分配最终会导致泄漏时,可以使用调试器去中断。但是你必须找到可再现的分配编号(尽管没那么容易)。如果能做到这一点,执行程序时调试器才会中断。

 我们来看下面的代码,分配了8个字节,却一直没释放分配的内存。Visual Studio提供了造成内存泄漏的对象的报告,多运行几次,会发现一直是同一个分配编号(341)。

1

2

3

4

5

6

7

8

9

void leak_some_memory()

{

   char* buffer = new char[8];

}

 

Dumping objects ->

d:\marius\vc++\debuggingdemos\debuggingdemos.cpp(103) : {341} normal block at 0x00F71F38, 8 bytes long.

 Data: <        > CD CD CD CD CD CD CD CD

Object dump complete.

在一个特定的(可复现的)位置中断的步骤如下:

1.      确定你有足够的关于内存泄漏的报告模式(参考 使用CRT库检测内存泄漏)

2.      多次运行程序直到你能在程序运行结束后的内存泄漏报告里找到一个可复现的分配编号,例如上个例子中的(341)

3.      在程序一开始的地方设置一个断点以便你能够尽早地进行中断。

4.      当最初的中断发生时,watch窗口的Name栏里会显示:{,,msvcr90d.dll}_crtBreakAlloc,在Value栏里写入你想要查找的位置编号

5.      继续调试(F5)

6.      程序执行到指定位置会停止,你可以使用调用栈被指引找到被该位置触发的那段代码。

遵循这些步骤, 在上个例子中,使用分配的编号(341)就可以识别内存泄漏的起因。

 

技巧9:调试发行版

调试和发布是两个不同的目的。调试配置是用于开发的,而发布配置,顾名思义,是用来作为程序的最终版本,因为它必须严格遵循发布的质量要求,该配置包含优化部分和调试版本的中断调试的设置。而且,有时候,要像调试调试版本一样去调试发行版。要做到这一点,你需要在配置里做一些改变。但是这种情况下,你就不再是在调试发行版,而是调试和发行的混合版。

 

你还应该做一些事儿,以下是必须要做的:

1.      配置C/C++ >General>Debug Information Format 应该为 “Program Database(/Zi)”

2.      配置C/C++ >Optimization>Optimization 应该为”Disabld(/Od)”

3.      配置Linker>Debugging>Generate Debug Info 应该为”Yes/(DEBUG)”

如图所示:

 

更多阅读:怎样调试发行版

技巧10:远程调试

另一个重要的调试就是远程调试,这是一个更大的话题,多次被提到,这里我只做一下简单的概括:

1.      你需要在远程机器上安装远程调试监控

2.      远程调试监控必须以管理员身份运行,并且用户必须属于管理员组

3.      在你运行监控时,会开启一个新的服务,该服务的名字必须用Visual Studio的Attach to Progress窗口的Qualifier组合框的值。

 

 

1.      远程和本地机器上的防火墙必须允许Visual Studio和远程调试监控之间能够通信

2.      想要调试,PDB文件是关键;为了能够让VisualStudio自动加载它们,必须满足以下条件:

1)本地的PDB文件必须可用(在远程机器的相同路径下放置一个对应的模块)。

 2) 远程机器上的托管PDB文化必须可用。

远程调试监控下载:

·         Visual Studio 2008 Service Pack 1 Remote Debugger

·        Microsoft Visual Studio 2010 Remote Debugger

更多阅读:

·        设置远程调试

·        怎么运行远程调试监控

·        远程调试时加载调试符号:本地对托管

·        PDB文件:开发者须知

·        Visual Studio远程调试和PDB文件

·        怎样指定符号位置和加载行为

 

技巧11: 数据断点

当数据所在的内存位置发生变化时,可以通知调试器进行中断,但是每次只能创建4个字节这样的硬件数据断点。数据断点只能在调试期间添加,可以通过菜单(Debug>New Breakpoint>New Data Breakpoint) 或者断点窗口来添加。

你可以使用内存地址或者地址表达式。尽管栈上和堆上的值你都可以看到,但是我认为当堆上的数值发生变化时,这个功能才会更有用处。它对于识别内存损坏有很大的帮助。

下面的例子中,指针的值发生了变化,不再是它所指向对象的值。为了找出在什么地方发生改变的,我在存储指针值的位置设置了一个断点,即&ptr(注意必须在指针初始化之后)。数据发生变化就意味着有人修改了指针的值,调试器发生中断,我就能找出是哪段代码引起的改变。

更多阅读:

1.怎样查明指针是否损坏内存

2.怎样查明指针在什么地方发生改变

技巧12: 线程重命名

在调试多线程应用程序时,线程窗口会显示创建了哪些线程以及当前正在运行的线程。线程越多,想找到你想要的线程就越困难(尤其是当一段程序被多个线程同时执行的时候,你不能确切地知道哪个才是当前正在执行的线程实例)。

调试器允许修改线程的名字,可以在线程窗口使用线程的快捷菜单,给线程重命名。

也可以在程序里给线程命名,尽管有点棘手,而且必须在线程启动之后给它命名,否则调试器会以默认命名规范将它重新初始化。定义一个线程,并用下面的函数重命名该线程。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

typedef struct tagTHREADNAME_INFO

{

    DWORD dwType;        // must be 0x1000

    LPCSTR szName;       // pointer to name (in same addr space)

    DWORD dwThreadID;    // thread ID (-1 caller thread)

    DWORD dwFlags;       // reserved for future use, most be zero

} THREADNAME_INFO;

 

void SetThreadName(DWORD dwThreadID, LPCSTR szThreadName)

{

    THREADNAME_INFO info;

    info.dwType = 0x1000;

    info.szName = szThreadName;

    info.dwThreadID = dwThreadID;

    info.dwFlags = 0;

 

    __try

    {

        RaiseException(0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info);

    }

    __except (EXCEPTION_CONTINUE_EXECUTION)

    {

    }

}

更多阅读:

设置线程名字(非托管)

技巧13: 给指定线程设置断点

 对于多线程应用程序来说,另一个有用的技巧就是给指定的线程,进程,甚至是计算机中的断点设置过滤.可以通过断点的Filter命令来实现此功能.

 

调试器允许你指定线程名,线程ID,进程名,进程ID和机器名的任意组合(使用AND,OR,NOT)来设置过滤。了解怎样设置线程名字也使得这项过滤操作变得更加简单。

更多阅读:

1.      怎样指定断点过滤器

2.      设置断点过滤

技巧14: (粗略)估算执行时间

在上一篇文章中,我有写关于Watch窗口中的伪变量,有一个没提到的是@clk,它用于显示计数器的值,可以粗略地计算出两个断点之间的代码的执行时间,单位是微秒(μS)。但是,千万不要用这个方法来分析程序的执行效率,应该使用Visual Studio 分析工具或者性能计时器来分析。

可以在Watch 窗口或者即时窗口添加@clk=0来完成对计时器的重置。因此要想估算执行一段代码需要多长时间,可以按照下面的步骤来操作:

1.      在代码块的开始位置设置断点

2.      在代码块的结束位置设置断点

1.      在Watch窗口添加 @clk

2.      程序进入到第一个断点时,在即时窗口输入@clk=0

3.      运行程序直到执行进入代码块末尾的断点,查看Watch窗口 @clk的值。

注意网上有一些技巧说在Watch窗口添加两个表达式:@clk和@clk=0,需要在每次执行断点的时候都要重置计时器。这种用法只适用于Visual Studio的老版本,在VS2005及以上版本不再适用。

更多阅读:

 调试技巧-@CLK

技巧15:数字格式化

当你在Watch或者Quick Watch窗口查看变量时, 这些值是以默认的预定义可视化形式显示的。而对于数字,则是根据数据类型(integer, float, double),用十进制形式显示的。但是你可以使用调试器把数字用不同的类型或者进制数显示出来。

想要改变显示类型可在变量前加以下前缀:

1.      by –unsigned char (又称为unsigned byte)

2.      wo – unsigned shot(又称为 unsigned word)

3.      dw – unsigned long(又称为 unsigned double word)

要改变显示的进制数在变量前加下列前缀:

1.      d 或者 i– 有符号十进制数

2.      u – 无符号十进制数

3.      o -  无符号八进制数

4.      x – 小写十六进制数

5.      X – 大写十六进制数

 

更多阅读:

C++ 调试技巧

技巧16:(内存数据)格式化

除了数字,调试器还可以在Watch窗口显示格式化的内存数据,最多64 bytes。你可以使用在表达式(变量或内存地址)后添加下列说明符作为后缀来格式化数据:

1.      mb 或者 m – 十六进制显示的16字节数据,后跟16个ASCII 字符

2.      mw – 8 words

3.      md – 4 double words

4.      mq -  2 quad-words

5.      ma – 64个ASCII字符

6.      mu – 2字节的UNICODE字符

 

更多阅读:

1.      C++中的格式说明符

2.      Developer Studio的调试技巧

技巧17: 系统DLL的中断

 有时候在DLL中的函数被调用时进行中断是很有用的,像系统DLL(比如 Kernel32.dll 或者user32.dll).实现此中断,需要使用本机调试器提供的上下文运算符.你可以设定断点位置,变量名或者表达式:

 1.{[函数],[源码],[模块]}位置

 2. [函数],[源码],[模块]}变量名

 3. [函数],[源码],[模块]}表达式

花括号里可以是函数名,源代码和模块的任意组合,但是逗号不能省略.

我们假设想要在CreateThread函数被调用时发生中断,这个函数是从kernel32.dll中导出的,所以上下文运算符应该为:  {,,kernel32.dll}CreateThread. 然而,这样并不可行,因为上下文运算符需要CreatThread的修饰符,可以使用DBH.exe来获取一个特定函数的修饰符。

下面就是如何得到CreateThread函数的修饰符的:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

C:\Program Files (x86)\Debugging Tools for Windows (x86)>dbh.exe -s:srv*C:\Symbo

ls*http://msdl.microsoft.com/Download/Symbols -d C:\Windows\SysWOW64\kernel32.dl

l enum *CreateThread*

Symbol Search Path: srv*C:\Symbols*http://msdl.microsoft.com/Download/Symbols

 

 index            address     name

     1            10b4f65 :   _BaseCreateThreadPoolThread@12

     2            102e6b7 :   _CreateThreadpoolWork@12

     3            103234c :   _CreateThreadpoolStub@4

     4            1011ea8 :   _CreateThreadStub@24

     5            1019d40 :   _NtWow64CsrBasepCreateThread@12

     6            1019464 :   ??_C@_0BC@PKLIFPAJ@SHCreateThreadRef?$AA@

     7            107309c :   ??_C@_0BD@CIEDBPNA@TF_CreateThreadMgr?$AA@

     8            102ce87 :   _CreateThreadpoolCleanupGroupStub@0

     9            1038fe3 :   _CreateThreadpoolIoStub@16

     a            102e6f0 :   _CreateThreadpoolTimer@12

     b            102e759 :   _CreateThreadpoolWaitStub@12

     c            102ce8e :   _CreateThreadpoolCleanupGroup@0

     d            102e6e3 :   _CreateThreadpoolTimerStub@12

     e            1038ff0 :   _CreateThreadpoolIo@16

     f            102e766 :   _CreateThreadpoolWait@12

    10            102e6aa :   _CreateThreadpoolWorkStub@12

    11            1032359 :   _CreateThreadpool@4

看上去实际名字应该是_CreateThreadStub@24,这样我们就可以创建断点,{,,kernel32.dll}_CreateThreadStub@24。

运行程序,发生中断时会有消息提示断点处无相关源代码,直接忽略它。

使用调用栈窗口查看调用该函数的代码。

更多阅读:

1.  在Visual Studio 2010中,没有源代码如何设置断点

2.  上下文运算符(C/C++语言表达式)

3.  怎样给函数设置断点

技巧18:加载符号表

在调试程序的时候,调用栈窗口不会显示完整的调用栈,跳过了系统DLL(比如kernel32.dll 和 user32.dll)的信息。

可以通过加载这些DLL的符号表来获得完整的调用栈信息,直接在调用栈窗口使用快捷菜单就能完成。你可以从预先指定的符号路径或者微软的符号服务器(如果是系统DLL)来下载符号。符号下载完成后,直接导入到调试器,调用栈就会得到更新。</span>

 

这些符合也可以从组件Modules窗口导入。

 

一旦下载完成,符号会保存在缓存中,可以在Tools>Options>Debugging>Symbols中配置。

 

技巧19:监测MFC中的内存泄漏

如果你想要在MFC应用程序中检测内存泄漏,需要使用宏DEBUG_NEW来重新定new运算符,这是new运算符的修改版本,记录了每个对象内存分配的文件名和行号.在发行版中DEBUG_NEW会解析成new运算符.

向导生成的MFC源文件在#includes后包含了下面的预处理指令:

1

2

3

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 这就是怎样重新定义new运算符的。

然而,很多STL头文件和重新定义的new运算符和版本不兼容.如果你重新定义了new运算符后,又包含了<map>,<vector>,<list>,<string>等头文件的话,就会出现下面的错误(以<vector>为例):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\xmemory(43) : error C2665: 'operator new' : none of the 5 overloads could convert all the argument types

1>        c:\program files\microsoft visual studio 9.0\vc\include\new.h(85): could be 'void *operator new(size_t,const std::nothrow_t &) throw()'

1>        c:\program files\microsoft visual studio 9.0\vc\include\new.h(93): or       'void *operator new(size_t,void *)'

1>        while trying to match the argument list '(const char [70], int)'

1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\xmemory(145) : see reference to function template instantiation '_Ty *std::_Allocate<char>(size_t,_Ty *)' being compiled

1>        with

1>        [

1>            _Ty=char

1>        ]

1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\xmemory(144) : while compiling class template member function 'char *std::allocator<_Ty>::allocate(std::allocator<_Ty>::size_type)'

1>        with

1>        [

1>            _Ty=char

1>        ]

1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\xstring(2216) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled

1>        with

1>        [

1>            _Ty=char

1>        ]

解决办法就是总是把包含这些STL头文件放在重新定义new运算符之前.

更多阅读:

 DEBUG_NEW

技巧20: 调试ATL

在开发ATL COM组件时,你可以在调试器观察COM对象的QueryInterface,AddRef和Release的调用情况.默认情况下并不支持这些,但是你只要在预处理定义或者预编译头文件时定义两个宏,宏定义好之后,关于这些函数的调用信息就会显示在output窗口.

这两个宏如下:

1.      _ATL_DEBUG_QI: 显示你定义的对象里每一个被查询的接口的名字,必须在atlcom.h被包含之前定义.

2.      _ATL_DEBUG_INTERFACES: 在每次AddRef 或者Release被调用时,显示接口的当前引用计数以及对应的类名和接口名,必须在atlbase.h被包含之前定义.

更多阅读:

1.      调试技巧

2.      ATL调试技巧

3.      _ATL_DEBUG_INTERFACES是如何工作的?

结束语

尽管这两篇文章并不是包含了所有的调试技巧,但是足以帮你解决原生开发中调试时遇到的大多数问题

Visual Studio 调试过程watch窗口使用归纳 windows 消息 在watch窗口中若需要展示一个windows消息变量的值, 可以使用 uMsg,wm 查看 普通变量 常用的还有: 1, d, i, u, o, x, X, f, e, g等,跟C语言printf里的一样,表示数字的各种形式,并支持4X等写法; 2, c, s, su(Unicode String)等,用于显示字符及字符串; 3, hr 用于显示Win32 error code; 4, wm用于显示windows消息,比如WM_CLOSE等 其中,hr本来用于显示HRESUL 阅读详情

相关推荐

Visual Studio中程序调试的方法

1.普通的断点调试 (1)快捷键F9(对应“调试”-“切换断点”命令),用于给光标所在的行增加断点(设置断点)或取消该行已有的断点,断点行最前面会有一个红色的小圆球表示该行有一个断点,如图1.11所示,可以通过将光标定位到多个行并每次都按F9键来为多个行增加断点。 (2)快捷键F5(对应“调试”→“开始调试”命令),用于开始执行程序,遇到第一个断点行就停下来,如图1.12所示,程序停到了第8行,这个红色圆球中间多了一个向右指向的黄色小箭头,表示程序执行流程停止到了这一行(虽然停止到了这一行,但是此刻这一行

qq_39838607的博客 7217

Vistual Studio原生开发的20条调试技巧(下)

我的上篇文章《Vistual Studio原生开发的10个调试技巧》引发了很多人的兴趣,所以我决定跟大家分享更多的调试技巧。接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧(接着上一篇文章来编号)。这些技巧需要应用在Vistual Studio 2005 或者更新的版本中(当然也有一些适用于旧版本)。如果你能阅读本文中推荐的一些相关文章,就可以知道每一个技巧的更多信息。 11. 

necrazy的专栏 1295

Visual Studio调试的技巧

当我们发现了程序中的问题后就会解决问题,前提是要找到问题,那么进行调试(debug)以此来找到问题。

2302_80045891的博客 1743

展开Visual C++调试器监视窗口中的数组指针方法

概要  从 Visual c + + 6.0 版开始就现在可以展开数组指向在 Visual c + + 调试器监视窗口中查看所有数组元素。此功能未记录。在监视窗口中键入... 从 Visual c + + 6.0 版开始就现在可以展开数组指向在 Visual c + + 调试器监视窗口中查看所有数组元素。此功能未记录。 在监视窗口中键入一个表达式,该表达式计算为后跟一个逗号和数组中的元素

zhouschina的专栏 3350

windows下编译可在visual studio中调试的FFmpeg

工欲善其事,必先利其器。对于一个开源项目最好最快的熟悉方式莫过于自己能够进行调试,而FFmpeg又是如此的强大、复杂。自己能够调试FFmpeg将给我们节省很多时间,能够跟快速的学习FFmpeg。分享一下在window7系统下编译能够在visual studio2010中进行调试FFmpeg的过程。一、编译环境windows7 32位 + visual studio2010 + MingGW + FF

Andy·Wu的专栏 6509

【Visual Studio】Visual Studio高效调试手段与调试技巧总结

Visual Studio高效调试手段与调试技巧总结。

dvlinker的技术专栏 2万+

【Visual Studio 2022】常用快捷键和一些小技巧

VS 2022 快捷键 1、F4,显示属性窗口。 2、F12,转到定义。 3、Shift+Tab,取消制表符。 4、F5,运行调试; Ctrl + F5,运行不调试;Shift+F5,结束调试。 5、Ctrl+E+C,注释选中内容;Ctrl+E+U,取消注释内容。 6、Ctrl+W+X,打开工具箱。 7、Ctrl+E+W,自动换行。 8、Ctrl+M+M,隐藏或展开当前嵌套的折叠状态。 9、Ct

习惯成自然 1万+

从仿真到现实:BeamDojo双足机器人项目实战指南(附完整配置清单)

本文提供了一份基于BeamDojo项目的双足机器人从仿真训练到现实部署的完整实战指南。详细拆解了硬件选型(如宇树G1、Jetson Orin NX、Livox Mid-360)、Isaac Gym仿真环境搭建、强化学习训练技巧(如双评论家架构、课程学习)以及关键的Sim2Real迁移策略,旨在帮助开发者将前沿研究成果转化为可落地的工程实践。

hhh00的博客 874

Visual Studio的实用调试技巧总结

全网Visual Studio编译器最详细的编程Debug调试,详细介绍了Debug和Release版本的的区别等相关知识,学会后敲代码速度嘎嘎上升!!

L_Daniel的博客 3948

Postman调试海康ISAPI接口全记录:从鉴权失败到成功修改设备名的踩坑指南

本文详细记录了使用Postman调试海康ISAPI接口的全过程,从鉴权失败到成功修改设备名的实战经验。涵盖Digest认证机制、XML请求体构造、常见错误排查及代码实现过渡,帮助开发者高效解决海康设备集成中的各种问题。

weixin_42620913的博客 660

当传统CFD遇上AI:PINN如何帮我们省下90%的仿真计算时间?

本文探讨了物理信息神经网络(PINN)在计算流体力学(CFD)中的应用,如何通过无网格方法节省90%的仿真计算时间。PINN将物理定律编码到神经网络中,显著减少传统CFD中的网格生成和计算时间,同时保持高精度。文章还对比了PINN与传统方法的性能,并讨论了其独特优势和当前局限。

weixin_32678995的博客 319

Visual Studio 2022实用调试技巧

创建断点和取消断点。的作⽤是可以在程序的任意位置设置断点,打上断点就可以使得程序执⾏到想要的位置暂定执行,接下来我们就可以使⽤F10,F11这些快捷键,观察代码的执⾏细节。满⾜这个条件,才触发断点。F5:启动调试,经常⽤来直接跳到下⼀个断点处,会与F9配合使⽤。开始执行不调试会忽略所有断点,如果你想让程序直接运⾏起来⽽不调试就可以直接使用。直接停止调试,同时自动关闭黑色终端。F10:逐过程,通常⽤来处理⼀个过程,⼀个过程可以是⼀次函数调⽤,或者是⼀条语句。(不可进入函数内部)逐语句。

2301_80030290的博客 3643

华为OD机试真题 新系统2026-04-08 C++ 实现【直捣黄龙】

小王在玩一款叫做直捣黄龙的小游戏,在该游戏中他需要从入口位置进入敌营,绕过哨兵的层层封锁,达到敌军司令部实施斩首行动。 敌军阵营是一个n*n的矩阵,入口在坐标(0,n/2),敌军司令部在坐标(n-1,n/2),每个 哨兵警戒以自己为中心的9宫格,一旦被哨兵发现则行动失败。

MISAYAONE的博客 261

11个Visual Studio调试小技巧

简介   调试是软件开发周期中很重要的一部分。它具有挑战性,同时也很让人疑惑和烦恼。总的来说,对于稍大一点的程序,调试是不可避免的。最近几年,调试工具的发展让很多调试任务变的越来越简单和省时。   这篇文章总结了可能节省你大量时间的十个visual studio的调试技巧和方法。   1 悬停鼠标查看表达式值   调试是很有挑战性的。比如在函数内逐步运行可以看出哪里

續寫經典 2305

基于Multisim/TINA的H桥电机驱动电路设计与仿真分析

摘要 本文基于Multisim/TINA仿真平台,对H桥电机驱动电路进行了系统设计与分析。研究重点包括H桥拓扑结构的工作原理、PWM调速控制方法以及两种驱动方案对比分析。通过光耦隔离驱动与IR2110专用驱动IC的仿真对比,验证了IR2110自举电路在高低侧驱动中的优势。仿真实验着重分析了死区时间对防止直通现象的关键作用,并建立了直流电机的R-L-E等效模型进行动态特性仿真。结果表明,采用IR2110驱动方案配合适当的栅极电阻和自举电容参数,能够实现电机的高效双向调速控制。本研究为实际电机驱动系统的设计提供

huanghm88的专栏 137

【推荐100个unity插件之2】 DoTween动画插件的安装和使用整合(最全)

摘要:DOTween动画插件使用指南 DOTween是Unity中强大的动画插件,比原生动画更便捷。安装后需进行初始化设置,通过工具菜单生成程序集。主要提供通用方法(DOTween.To)和便捷方法(如transform.DOMove)两种动画实现方式。插件支持丰富的动画设置(循环、缓动等)和事件回调(OnComplete、OnKill)。还提供动画管理功能,包括清除(DOTween.Clear)、完成(DOTween.CompleteAll)和终止(DOTween.KillAll)动画。常用功能涵盖移动、

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

Visual studio调试技巧

Visual studio调试技巧

dab112的博客 1964

Chamfer Loss

ChamferLoss是一种常用于3D点云(pointcloud)处理的损失函数,特别是在点云生成和对齐任务中。它的目的是度量两个点集之间的相似度,特别是在点云重建、配准或生成等任务中,常用于优化模型使得生成的点云更接近真实的点云。

夜空中明亮的星的专栏 454

Visual Studio断点调试的一些小技巧

之前在调试的时候,比较讨厌断点打在for或者foreach中,我是这样操作的,运行程序的时候,代码直接跳到15行,然后检查变量,然后不断的F10,F10,F10一直到下一次循环的该断点处,再检查变啦,然后再不断的F10,F10,F10,每次都好麻烦。 现在知道了,直接按continue,或者直接F5,就会在调试过程中直接跳到下一个断点处。 应用在循环中,就是直接F5跳到下一次循环的该断...

niaxiapia的博客 2350

FineBI学习总结

交叉表:一组作为行标题显示在表的左部,另一组作为列标题显示在表的顶部。连接到数据,如果数据不满足数据分析的需求,先进行自助数据集处理。数据集分类:DB表、SQL、Excel、自助数据集。分组表:将报表中的数据按相同项合并为一组显示。1、数据准备2、制作仪表板3、分享仪表板。左合并:保留左边全部数据,合并右边。右合并:保留右边全部数据,合并左边。上下拼接:上下拼接到一张表数据。3、如何实现拼表:多表拼一张。分组–业务包–数据集–字段。字段分类:数值、文本和日期。目录–仪表板–数据准备。维度:文本和日期类型。

Rsun2018的博客 1561

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Visual Studio C++ 远程调试

在项目/产品开发过程中,BUG总是无处不在,几乎不可避免,我想没有人可以拍着胸脯说:本次上线百分百绝对无BUG。 如果BUG出现在项目开发周期内,则开发人员可以通过各种测试来发现定位BUG,并在自己的开发机(自己的台式机或笔记本,部署了开发环境)上调试跟踪、解决BUG,这是绝大部分开发人员都会经历且熟练于心的一种解决BUG的方式。

闲情逸致~ 3894

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Visual Studio Code搭建PHP调试环境

使用Visual Studio Code搭建PHP调试环境 一.需要安装的软件 Visual Studio Code安装可以参照博文: https://blog.youkuaiyun.com/qq_34195507/article/details/94558862 WAMP(包括Apache、MySQL、PHP、以及最关键的XDebug) wampserver安装可以参照博文: https://blog.cs...

灵越启航 6381

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Visual Studio中的常用调试功能(下)

本文介绍了Visual Studio调试工具栏中的常用调试功能。主要包括逐语句执行(F11)、逐过程执行(F10)、跳出执行(Shift+F11)和运行到光标处(Ctrl+F10)四种代码执行方式;断点管理技巧如禁用断点、查看所有断点;以及调试过程中的变量查看方法,包括局部变量窗口、自动窗口、即时窗口和并行监视功能。此外还介绍了移动执行指针和查看Windows API错误码的技巧,为开发者提供了全面的Visual Studio调试指南。

【微软MVP】zhaotianff的专栏 1665

Visual Studio的几个小技巧

Visual Studio的几个小技巧调试快捷键变量查看局部变量窗口监视窗口内存查看第一步 设置显示数据格式第二步 设置一行显示数据量和显示地址错误处理写代码快捷键代码复制粘贴技巧通过成员函数声明在.cpp文件中快速构建定义 调试 快捷键 按键 功能 F5 调试运行 Ctrl+F5 不调试运行(跳过所有断点) F10 单步步过(遇到函数不会进入函数,直接得到结果) F11 单步步入(遇到函数会进入函数) F9 设置/解除断点 Ctrl+Shift+F9 删除所有断点

旻的博客 1205
上一篇: 软件调试笔记44 - 堆和堆检查 : 堆缓冲区溢出
下一篇: 如何让程序跑得更快些?——试试Visual Studio中的性能分析工具 (By Jun Guo)
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值