Temporary breakpoint 1, main () at main.c:7 7 printf("enter main...\n"); (gdb) n
Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7e01097 in __printf_buffer (buf=buf@entry=0x7fffff7ff370, format=format@entry=0x7ffff7fba01d "malloc(%zu) = %p\n", ap=ap@entry=0x7fffff7ff470, mode_flags=mode_flags@entry=0) at ./stdio-common/vfprintf-internal.c:600
void* malloc(size_t size) { staticvoid* (*real_malloc)(size_t) = NULL; if (!real_malloc) { real_malloc = dlsym(RTLD_NEXT, "malloc"); if (!real_malloc) { constchar *error = "Error in `dlsym` for `malloc`\n"; write(STDERR_FILENO, error, strlen(error)); _exit(1); } } void* ptr = real_malloc(size); char buffer[256]; int len = snprintf(buffer, sizeof(buffer), "malloc(%zu) = %p\n", size, ptr); write(STDOUT_FILENO, buffer, len); return ptr; }
voidfree(void* ptr) { staticvoid(*real_free)(void*) = NULL; if (!real_free) { real_free = dlsym(RTLD_NEXT, "free"); if (!real_free) { constchar *error = "Error in `dlsym` for `free`\n"; write(STDERR_FILENO, error, strlen(error)); _exit(1); } } char buffer[256]; int len = snprintf(buffer, sizeof(buffer), "free(%p)\n", ptr); write(STDOUT_FILENO, buffer, len); real_free(ptr); }
修改后的运行结果:
1 2 3 4 5 6 7
linhanmic@MOSS:~/study$ ./main malloc(1024) = 0x558cae5fa2a0 enter main... malloc(40) = 0x558cae5fa6b0 returning to main... free(0x558cae5fa6b0) not match