在Visual Studio 2005 c ++多线程程序中跟踪函数的进入和退出的快速方法是什么?

时间:2008-10-26 19:52:37

标签: c++ visual-studio-2005 trace activemq visual-c++-2005

由于我使用activemq-cpp API的方式,我的ActiveMQ库中出现了间歇性崩溃。如果我可以观察导致崩溃的每个被调用的函数,那么调试问题要容易得多。有没有快速的方法来跟踪Visual Studio 2005 c ++多线程程序中函数的进入和退出?

提前致谢!

3 个答案:

答案 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可以帮助您 这种事情应该是你常规编程工作的一部分。编写函数时,您应该考虑哪些跟踪消息可以帮助您进行调试 您需要编写/使用现有的记录器,它可以分配到部分(读者线程,工作线程等)和不同的记录级别(错误,警告,跟踪,详细等)。优秀的记录器应该以不损害性能的方式设计,这通常会损害详细程度,但通常可以重现复杂的同步问题,除非记录速度非常快,比如将一个字符串指针分配给可以在问题后转储的数组被转载。我通常开始调试,完全跟踪转储到屏幕上,如果我幸运并以这种方式再现错误,修复错误是微不足道的,因为我已经有足够的信息,当问题消失时,乐趣开始,你需要玩详细的,以便重现问题。
我实际上发现调试比代码编写更有创意和满意,但这只是我:)。