Frage

Hallo, ich lerne einige Debugging-Konzepte.In diesem Programm versuche ich, einen Core-Dump zu simulieren.Ich gehe davon aus, dass der Kern ausgegeben wird, aber es wird kein Kern generiert.Programm wird ohne Probleme ausgeführt.

Zuerst ordne ich 20 Bytes für ptr zu.Ich kopiere eine neue Zeichenfolge nach ptr.Dann gebe ich PTR frei und drucke PTR aus, es funktioniert ohne PBLM.Schließlich weise ich noch eine andere Zeichenfolge zu, von der ich erwarte, dass sie dieses Mal einen Core-Dump generiert.Aber ich habe keinen Core-Dump bekommen.Kann mir bitte jemand erklären, warum kein Core-Dump generiert wird?

int main()
{
   char *ptr;
   ptr =(char*)  malloc (20);
   strcpy(ptr,"MemoryOperations");
   printf("Before Free memory : %s\n",ptr);
   free(ptr);
   printf("After Free memory : %s\n",ptr);
   strcpy(ptr,"MemReassign");
   printf("After Re Assigning : %s\n",ptr);
   return 0;
}

Derselbe Code, den ich mit dbx ausführe,

(dbx) check -all
access checking - ON
memuse checking - ON
(dbx) run
Running: a.out 
(process id 19081)
RTC: Enabling Error Checking...
RTC: Running program...
Before Free memory : MemoryOperations
Read from unallocated (rua):
Attempting to read 1 byte at address 0x100101a48
which is 2232 bytes into the heap; no blocks allocated
stopped in _ndoprnt at 0xffffffff671abbf0
0xffffffff671abbf0: _ndoprnt+0x1c04:    call     _PROCEDURE_LINKAGE_TABLE_+0x620 [PLT] ! 0xffffffff67340d20
(dbx) exit
War es hilfreich?

Lösung

Free (PTR) ändert den Wert des PTR nicht.Es markiert nur, dass der entsprechende Standort für die RealLassung verfügbar ist.

generasacodicetagpre.

Wenn Sie also eigentlich Kern-Dump generieren möchten, versuchen Sie, etwas sicher zu erschossen, dann versuchen Sie etwas verrückt, wie:

generasacodicetagpre.

Andere Tipps

Wenn Sie in den Speicher schreiben, nachdem dieser freigegeben wurde, kann alles passieren.Es ist undefiniertes Verhalten.Sie können einen Core-Dump erhalten oder nicht.In Ihrem Fall erhalten Sie keinen Core-Dump, da der Speicher, auch wenn er freigegeben wurde, für Ihren Prozess weiterhin zugänglich ist.Buf, wenn du noch eins machen würdest malloc kurz vor dem return 0 Wenn Sie eine Anweisung ausführen und in diesen Speicher schreiben, wird die Zeichenfolge „After Re Assigning ...“ höchstwahrscheinlich überschrieben.

Mit dbx, dem printf("After Free memory : %s\n",ptr); Die Anweisung erzeugt einen „Read from unallocated“-Fehler, weil Sie die Zugriffsprüfung aktiviert haben, aber ohne dbx gibt es überhaupt keine Zugriffsprüfung.

Um einen Core-Dump zu simulieren, können Sie Folgendes tun:

void main()
{
  char *p = NULL ;
  *p = 'A' ;
}

Dies führt auf den meisten Plattformen zum Absturz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top