Pregunta

Hola estoy aprendiendo algunas de depuración de conceptos.En este programa, estoy tratando de simular volcado de núcleo.Espero núcleo será objeto de dumping, Pero no generar núcleo.Programa de ejecutar sin ningún problema.

En primer lugar me asignar 20 bytes para ptr.Puedo copiar una nueva cadena de ptr.Entonces me libre de ptr, a continuación, imprimir ptr se trabaja sin pblm.Por fin puedo volver a asignar alguna otra cadena que esperar este tiempo puede generar volcado de núcleo.Pero no me dieron de volcado del núcleo.Puede alguien pls explicar por qué no su generación 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;
}

Mismo código que se ejecutan mediante 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
¿Fue útil?

Solución

libre (PTR) no modifica el valor de la PTR.Simplemente marca que la ubicación correspondiente está disponible para la reasignación.

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

Por lo tanto, si realmente desea generar volcado central, intente algo seguro, intente algo loco, como:

char d=10/0;  //arithematic

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

Otros consejos

Si usted escribe en la memoria después de que se ha liberado, cualquier cosa puede suceder.Es un comportamiento indefinido.Usted puede obtener un volcado de núcleo o no.En el caso de no obtener un volcado de núcleo porque la memoria, incluso si ha sido liberado, aún se puede acceder mediante el proceso.Buf si usted no haría otra malloc justo antes de la return 0 declaración y escribir en la memoria, la cadena "Después de Volver a Asignar ..." más probable es que se sobrescriben.

Con dbx, el printf("After Free memory : %s\n",ptr); instrucción genera una "Lectura de sin asignar" error porque tienes activado el acceso de cheques, pero sin dbx no hay acceso a la comprobación en todos.

Para la simulación de un volcado de núcleo usted puede hacer esto :

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

Esto va a bloquear en la mayoría de plataformas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top