由于我使用activemq-cpp API的方式,我的ActiveMQ库中出现了间歇性崩溃。如果我可以观察导致崩溃的每个被调用的函数,那么调试问题要容易得多。有没有快速的方法来跟踪Visual Studio 2005 c ++多线程程序中函数的进入和退出?
提前致谢!
答案 0 :(得分:3)
使用Tracer对象。像这样:
class Tracer
{
public:
Tracer(const char *functionName) : functionName_(functionName)
{
cout << "Entering function " << functionName_ << endl;
}
~Tracer()
{
cout << "Exiting function " << functionName_ << endl;
}
const char *functionName_;
};
现在你可以简单地在函数顶部实例化一个Tracer对象,当函数退出并调用析构函数时它会自动打印“exiting ...”:
void foo()
{
Tracer t("foo");
...
}
答案 1 :(得分:2)
当调试器附加到进程时,您可以右键单击源代码并选择“breakpoint-&gt; add TracePoint”,并选择所需的文本(甚至提供一些宏)。
Tracepoint实际上是一个BreakPoint,在某些消息打印机功能上具有“When Hit”字段,并且它实际上并没有破坏该过程。我发现它非常有用:它还有一个宏$ FUNCTION,它完全符合你的需要:打印它所在的函数(前提是它有调试信息......)和$ THREADID。
答案 2 :(得分:2)
以上所有选项都很好,可以帮到你。但我无法看到如果您的代码具有数千个功能,如何使用鼠标设置TracePoing可以帮助您
这种事情应该是你常规编程工作的一部分。编写函数时,您应该考虑哪些跟踪消息可以帮助您进行调试
您需要编写/使用现有的记录器,它可以分配到部分(读者线程,工作线程等)和不同的记录级别(错误,警告,跟踪,详细等)。优秀的记录器应该以不损害性能的方式设计,这通常会损害详细程度,但通常可以重现复杂的同步问题,除非记录速度非常快,比如将一个字符串指针分配给可以在问题后转储的数组被转载。我通常开始调试,完全跟踪转储到屏幕上,如果我幸运并以这种方式再现错误,修复错误是微不足道的,因为我已经有足够的信息,当问题消失时,乐趣开始,你需要玩详细的,以便重现问题。
我实际上发现调试比代码编写更有创意和满意,但这只是我:)。