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

提前致谢!

有帮助吗?

解决方案

使用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对象,它将自动打印“退出...”。当函数退出并调用析构函数时:


void foo()
{
  Tracer t("foo");
   ...
}

其他提示

当调试器附加到进程时,您可以右键单击源代码并选择“breakpoint-&gt; add TracePoint”,并使用您想要的文本(甚至提供一些宏)。

Tracepoint实际上是一个BreakPoint,其中包含“When Hit”和“When Hit”。某些消息打印机功能上的字段,它实际上并没有破坏该过程。我发现它非常有用:它还有一个宏$ FUNCTION,它可以完全满足你的需要:打印它所在的函数(前提是它有调试信息......)和$ THREADID。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top