Posso definir um ponto de interrupção de dados em tempo de execução no System C (ou no Plain Vanilla C++)?

StackOverflow https://stackoverflow.com/questions/56340

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu tenho uma classe no sistema-C com alguns membros de dados como estes:

long double x[8];

Estou inicializando na construção assim:

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

Mas na primeira vez que uso no meu código, tenho lixo lá.

Devido à forma como o sistema é construído, não consigo conectar um depurador facilmente.Existem métodos para definir um ponto de interrupção de dados no código para que ele me diga onde no código as variáveis ​​foram realmente alteradas, mas sem conectar um depurador?

Editar:@Prakash:Na verdade, isso é um erro de digitação no pergunta, mas não no meu código ...Obrigado!

Foi útil?

Solução

Você poderia tentar iniciar um segundo thread que gira, procurando por mudanças na variável:


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

Isso gerará um sinal SIGTRAP para sua aplicação sempre que qualquer um dos valores de x for diferente de zero.

Outras dicas

Apenas use imprimir/syslog.

É antiquado, mas super fácil.

Claro, será um lixo!

O código deveria ter sido tão

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

EDITAR:Ops, desculpe por subestimar ;)

@Frank

Na verdade, isso me permite registrar impressões de depuração em um arquivo.O que procuro é algo que me permita imprimir algo sempre que uma variável for alterada, sem que eu procure explicitamente pela variável.

Que tal Pontos de interrupção condicionais?Você poderia tentar várias condições, como o valor do primeiro elemento ser zero ou diferente de zero, etc?

Supondo que eu possa conectar facilmente um depurador.A questão toda é que eu só tenho uma biblioteca, mas o executável que a vinculou não está prontamente disponível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top