Могу ли я установить точку останова данных во время выполнения в System C (или в Plain Vanilla C ++)? - PullRequest
0 голосов
/ 11 сентября 2008

У меня есть класс в system-C с некоторыми элементами данных как таковыми:

long double x[8];

Я инициализирую его в такой конструкции:

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

Но когда я впервые использую его в своем коде, у меня там мусор.

Из-за особенностей построения системы я не могу легко подключить отладчик. Существуют ли методы для установки точки останова данных в коде, чтобы она сообщала мне, где в коде переменные были фактически изменены, но без подключения отладчика?

Edit: @Prakash: На самом деле, это опечатка в вопросе , но не в моем коде ... Спасибо!

Ответы [ 6 ]

0 голосов
/ 30 сентября 2008

Вы можете попробовать запустить второй поток, который вращается, ища изменения в переменной:


#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]);

Это вызовет сигнал SIGTRAP для вашего приложения, если любое из значений x не равно нулю.

0 голосов
/ 11 сентября 2008

Это при условии, что я могу легко подключить отладчик. Все дело в том, что у меня есть только библиотека, но исполняемый файл, с которым она связана, недоступен.

0 голосов
/ 11 сентября 2008

Как насчет Условных точек останова ? Вы можете попробовать различные условия, например, значение первого элемента равно нулю или не равно нулю и т. Д. ??

0 голосов
/ 11 сентября 2008

@ Frank

На самом деле, это позволяет мне записывать отладочные отпечатки в файл. То, что я ищу, - это то, что позволит мне печатать что-то всякий раз, когда переменная изменяется, без моего явного поиска переменной.

0 голосов
/ 11 сентября 2008

Просто используйте printk / syslog .

Это старомодно, но супер пупер легко.

0 голосов
/ 11 сентября 2008

Конечно, это будет мусор!

Код должен быть как

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

РЕДАКТИРОВАТЬ: К сожалению, извините за недооценку;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...