我可以在System C(或者Plain Vanilla C ++)的运行时中设置数据断点吗?

时间:2020-03-05 18:51:23  来源:igfitidea点击:

我在System-C中有一个带有一些数据成员的类,例如:

long double x[8];

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

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

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

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

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

解决方案

回答

当然,这将是垃圾!

该代码应该是

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

编辑:糟糕,对不起,低估了;)

回答

只需使用printk / syslog。

它是老式的,但超级傻瓜容易。

回答

@坦率

实际上,这使我可以将调试打印记录到文件中。我正在寻找的东西将使我每当变量更改时就打印出一些东西,而无需我明确地寻找该变量。

回答

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

回答

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

回答

我们可以尝试启动另一个旋转的线程,以查找变量中的更改:

#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信号。