Posso impostare un punto di interruzione dei dati in runtime in System C (o in Plain Vanilla C++)?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Ho una classe nel sistema C con alcuni membri dati in quanto tali:

long double x[8];

Lo sto inizializzando nella costruzione in questo modo:

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

Ma la prima volta che lo uso nel mio codice ho della spazzatura lì.

A causa del modo in cui è costruito il sistema, non riesco a connettere facilmente un debugger.Esistono metodi per impostare un punto di interruzione dei dati nel codice in modo che mi dica dove nel codice le variabili sono state effettivamente modificate, ma senza collegare un debugger?

Modificare:@Prakash:In realtà, questo è un errore di battitura nel file domanda, ma non nel mio codice...Grazie!

È stato utile?

Soluzione

Potresti provare ad avviare un secondo thread che gira, cercando modifiche nella variabile:


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

Ciò invierà un segnale SIGTRAP alla tua applicazione ogni volta che uno qualsiasi dei valori x è diverso da zero.

Altri suggerimenti

Basta usare printk/syslog.

È vecchio stile, ma super facile.

Certo, sarà spazzatura!

Il codice avrebbe dovuto essere come

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

MODIFICARE:Ops, scusate la sottovalutazione ;)

@Franco

In realtà, questo mi consente di registrare le stampe di debug in un file.Quello che sto cercando è qualcosa che mi permetta di stampare qualcosa ogni volta che una variabile cambia, senza che io cerchi esplicitamente la variabile.

Che ne dite di Punti di interruzione condizionali?Potresti provare varie condizioni come il valore del primo elemento è zero o diverso da zero, ecc??

Ciò presuppone che io possa facilmente connettere un debugger.Il punto è che ho solo una libreria, ma l'eseguibile che la collega non è immediatamente disponibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top