Posso definir um ponto de interrupção de dados em tempo de execução no System C (ou no Plain Vanilla C++)?
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!
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.