Question

Bonjour, j'apprends quelques concepts de débogage.Dans ce programme, j'essaie de simuler un core dump.Je m'attends à ce que le noyau soit vidé, mais ce n'est pas un noyau généré.Le programme s'exécute sans aucun problème.

J’alloue d’abord 20 octets pour ptr.Je copie une nouvelle chaîne dans ptr.Ensuite, je libère ptr, puis j'imprime ptr en fonctionnant sans aucun problème.Enfin, je réattribue une autre chaîne qui, cette fois, pourrait générer un vidage de mémoire.Mais je n'ai eu aucun core dump.Quelqu'un peut-il expliquer pourquoi il ne génère pas de core dump.

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;
}

Même code que j'exécute en utilisant dbx,

(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
Était-ce utile?

La solution

libre (PTR) ne modifie pas la valeur du PTR.Il marque simplement que l'emplacement correspondant est disponible pour la réaffectation.

A block of memory previously allocated by a call to malloc, calloc or realloc is
deallocated, making it available again for further allocations.
Notice that this function does not change the value of ptr itself, 
hence it still points to the same (now invalid) location.
--cplusplus.com

Par conséquent, si vous voulez réellement générer un vidage de base, essayez quelque chose de coup sûr, essayez quelque chose de fou, comme:

char d=10/0;  //arithematic

char *a=malloc(1);
free(a);
a=NULL;   //this is important after free.
*a=100;

Autres conseils

Si vous écrivez dans la mémoire après sa libération, tout peut arriver.C'est un comportement indéfini.Vous pouvez obtenir un core dump ou non.Dans votre cas, vous n'obtenez pas de core dump car la mémoire, même si elle a été libérée, est toujours accessible par votre processus.Buf, si tu pouvais en faire un autre malloc juste avant le return 0 et écrivez dans cette mémoire, la chaîne "After Re Assigning ..." sera très probablement écrasée.

Avec dbx, le printf("After Free memory : %s\n",ptr); L'instruction produit une erreur "Lire à partir d'un élément non alloué" car vous avez activé la vérification d'accès, mais sans dbx, il n'y a aucune vérification d'accès du tout.

Pour simuler un core dump, vous pouvez faire ceci :

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

Cela plantera sur la plupart des plateformes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top