我可以在系统 C 的运行时(或普通 C++ 中)设置数据断点吗?

Can I set a data breakpoint in runtime in System C (or in Plain Vanilla C++)?

提问人:Nathan Fellman 提问时间:9/11/2008 最后编辑:Nathan Fellman 更新时间:10/1/2008 访问量:1164

问:

我在 system-C 中有一个类,其中包含一些数据成员,如下所示:

long double x[8];

我在构造中像这样初始化它:

for (i = 0; i < 8; ++i) {
    x[i] = 0;
}

但是我第一次在代码中使用它时,那里有垃圾。

由于系统的构建方式,我无法轻松连接调试器。是否有任何方法可以在代码中设置数据断点,以便它告诉我变量在代码中的实际更改位置,但不挂钩调试器?

编辑: @Prakash: 实际上,这是问题中的错别字,但不是我的代码中的错别字......谢谢!

C++ Linux 调试

评论


答:

0赞 prakash 9/11/2008 #1

当然,这将是垃圾!

代码应为

for (i = 0; i < 8; ++i) {
    x[i] = 0;
}

编辑:哎呀,对不起,低估了;)

0赞 Frank Krueger 9/11/2008 #2

只需使用 printk/syslog

这是老式的,但超级容易。

0赞 Nathan Fellman 9/11/2008 #3

@Frank

实际上,这让我可以将调试打印记录到文件中。我正在寻找的东西可以让我在变量发生变化时打印一些东西,而无需我明确寻找变量。

0赞 prakash 9/11/2008 #4

条件断点怎么样?您可以尝试各种条件,例如第一个元素值为零或非零等??

0赞 Nathan Fellman 9/11/2008 #5

这是假设我可以轻松连接调试器。关键是我只有一个库,但链接它的可执行文件并不容易获得。

0赞 Adam Rosenfield 10/1/2008 #6

您可以尝试启动第二个旋转的线程,以查找变量中的变化:


#include <pthread.h>

void *ThreadProc(void *arg)
{
  volatile long double *x = (volatile long double *)arg;
  while(1)
  {
    for(int i = 0; i < 8; i++)
    {
      if(x[i] != 0)
      {
        __asm__ __volatile__ ("int 3");  // breakpoint (x86)
      }
  }

  return 0;  // Never reached, but placate the compiler
}
...
pthread_t threadID;
pthread_create(&threadID, NULL, ThreadProc, &x[0]);

每当任何 x 值不为零时,这将向您的应用程序发出 SIGTRAP 信号。