3

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

提前致谢!

4

3 回答 3

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");
   ...
}
于 2008-10-26T19:54:25.780 回答
2

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

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

于 2008-10-26T20:04:42.280 回答
2

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

于 2008-10-26T20:53:18.737 回答