我们很少有人会否认调试器的强大之处,但为了使其更有用,可以使用一些技巧。
例如在 Python 中,您可以使用 pass 除了为您留出放置断点的空间并允许您观察“监视”窗口中的值之外,什么也不做。
在C#中,我以前使用GC.Collect(),但现在我使用if (false){}
你最好玩的假台词是什么?
在C#中,你可以使用这个:
System.Diagnostics.Debugger.Break();
它将强制断点。
在 C# 中、在 Visual Studio 中
{}
或
;
Debug.Assert(true);,它会自动从发布版本中编译出来。
volatile int e = 9;
Volatile 意味着编译器不会删除它,因为我不读取该变量。 “9”只是为了使其非零。 零对我来说太常见了。
在 gcc/g++ 中:
assert("breakpoint");
因为断言的任何非 0/null 值都被视为 true。
甚至
__asm__("nop");
至少我知道会发出一个指令字节来发生断点。 ;)
对于 C/C++,我使用
__asm int 3;
这将在调试器将捕获的该代码行生成断点异常。但需要注意的是,如果您的程序未在调试器内运行,则会因该异常而崩溃。
我用
int x = 0;
我总是确保在完成调试后删除这一行。
我从来没有写过专门为了继续下去的东西,但如果我这样做了,我会写
int moot;
当存在一些我不关心但必须提供的必需“out”参数时,我会使用此参数。
确实,如果断点位于空语句(例如分号)上,VS2010 调试器会移动断点,这很奇怪。不管它看起来像什么,在调试版本中,您通常仍然可以在空的 C# 控制块或分号上放置断点,并且它会被正确命中。在对此感到恼火一段时间后,我刚刚创建了这个来代替使用:
public static class Nop { public static void X() { } };
编辑:要使用它,请将
Nop.X()
放入您的代码中...
在 VB6 中,我单独使用冒号。
:
在c++中我使用
Sleep(0)
有时,或者只是找到一个使用过的变量并将其分配给自身:
i = i;
不是很复杂,但很实用。
bool bp;
bp = true; //whereever I need to break.