Есть странные функции malloc, которые я не использовал
Я использую пин-код для анализа моей простой программы.
Он имеет 4 функции malloc, однако, когда я использую pin с pintool под названием malloctrace, он показывает более 4 malloc.
Каковы эти функции malloc?
Моя ОС Ubuntu 12.04 64bit. ниже пунктов код, что я делаю и результат пинтоин.
#include <stdio.h>
#define SIZE 100
int main()
{
int *test1 = (int*)malloc(SIZE* sizeof(int));
int *test2 = (int*)malloc(SIZE* sizeof(int));
int i, j;
int *test3 = (int*)malloc(16*sizeof(int));
int *test4 = (char*)malloc(SIZE* sizeof(int));
test1[0] = 2;
test1[2] = 3;
test2[0] = 5;
printf("test1's addr : %p , test1's val = %d \n", test1, test1[0]);
printf("test1's addr : %p , test1's val = %d \n", &test1[1], test1[1]);
printf("test2's addr : %p , test2's val = %d \n", &test1[9], test1[9]);
return 0;
}
name size start_addr malloc_IP access_cnt
malloc 0x589 0 0x7ffff7de557e 0
malloc 0x489 0 0x7ffff7de557e 0
malloc 0xf 0 0x7ffff7ddd29e 0
malloc 0x4b 0 0x7ffff7df01b2 0
malloc 0x28 0 0x7ffff7de1fe7 0
malloc 0x14a0 0 0x7ffff7de202c 0
malloc 0x28 0 0x7ffff7de22ad 0
malloc 0x48 0 0x7ffff7ddf9d3 0
malloc 0x5c 0 0x7ffff7ddf9d3 0
malloc 0x5c 0 0x7ffff7ddf9d3 0
malloc 0x39 0 0x7ffff7ddf9d3 0
malloc 0x20 0 0x7ffff7de294e 0
malloc 0x492 0 0x7ffff7de557e 0
malloc 0x20 0 0x7ffff7de57ed 0
malloc 0x28 0 0x7ffff7de776f 0
malloc 0x38 0 0x7ffff7de7900 0
malloc 0x48 0 0x7ffff7deab5a 0
malloc 0x48 0 0x7ffff7deab5a 0
malloc 0x228 0 0x7ffff7deab5a 0
malloc 0x90 0 0x7ffff7deab5a 0
malloc 0x410 0 0x7ffff7ddaf22 0
malloc 0x110 0 0x7ffff7debd52 0
malloc 0x190 0 0x4013d2 0
malloc 0x190 0x603010 0x4013d2 0
malloc 0x190 0x6031b0 0x4013e0 0
malloc 0x40 0x603350 0x4013ee 0
malloc 0x190 0x6033a0 0x4013fc 0
free 0 0 0x401688 0
free 0 0 0x401688 0
free 0 0 0x401688 0
free 0 0 0x401688 0
free 0 0 0x4016b0 0
free 0 0 0x4016b0 0
free 0 0 0x4016d7 0
free 0 0 0x4016d7 0
free 0 0 0x4016d7 0
free 0 0 0x4016d7 0
free 1 0 0x4016e8 0
free 0 0 0x4016e8 0
free 0 0 0x401718 0
free 0 0 0x401718 0
3 ответа
Важные для вас вызовы malloc это
malloc 0x190 0x603010 0x4013d2 0
malloc 0x190 0x6031b0 0x4013e0 0
malloc 0x40 0x603350 0x4013ee 0
malloc 0x190 0x6033a0 0x4013fc
Остальные вызываются изнутри некоторыми системными вызовами.
Вполне возможно, что другие вещи могут вызывать malloc
под обложками, включая код времени выполнения C (например, для потоковых данных, используемых такими вещами, как strtok
) или даже сам инструмент анализа.
Если вы изучите начальный адрес всех этих блоков памяти, вы заметите, что все, кроме тех, которые вы делаете, 0
(100 4 байта int
переменные принимают оп 400
или же 0x190
байт, 16 из них занимают 64
или же 0x40
байт).
Это может быть уместно здесь, хотя также может быть, что вы единственный, кто не убирает за собой:-)
Кстати, вы не должны разыгрывать возвращаемое значение malloc
в C, так как он может скрыть некоторые тонкие ошибки, например, когда ваш int
и размеры указателя разной ширины, и вы забыли включить stdlib.h
и то, и другое здесь возможно, если вы работаете в 64-битной среде.
С вполне способен на неявное приведение void *
вернулся из malloc
в любой другой тип указателя.
Вы можете использовать GDB, чтобы узнать, что происходит и кто звонит malloc()
, В вашем случае вы увидите много перерывов в ld-linux.so:
Breakpoint 3, malloc (n=n@entry=136) at dl-minimal.c:93
93 in dl-minimal.c
(gdb) where
#0 malloc (n=n@entry=136) at dl-minimal.c:93
#1 0xb7ff3baa in calloc (nmemb=nmemb@entry=17, size=size@entry=8) at dl-minimal.c:113
#2 0xb7fef628 in allocate_dtv (result=result@entry=0xb7e00900) at dl-tls.c:296
#3 0xb7fefaf8 in _dl_allocate_tls_storage () at dl-tls.c:364
#4 0xb7fdecc7 in init_tls () at rtld.c:771
#5 0xb7fe0fcd in dl_main (phdr=0x8048034, phnum=9, user_entry=0xbfffedbc, auxv=0xbfffef5c) at rtld.c:1819
#6 0xb7ff33b6 in _dl_sysdep_start (start_argptr=start_argptr@entry=0xbfffee50, dl_main=dl_main@entry=0xb7fdf720 <dl_main>) at ../elf/dl-sysdep.c:241
#7 0xb7fe2dd4 in _dl_start_final (arg=0xbfffee50) at rtld.c:337
#8 _dl_start (arg=0xbfffee50) at rtld.c:563
#9 0xb7fdf197 in _start () from /lib/ld-linux.so.2
Функция _start - это точка входа в программу, которая вызывается перед функцией main(). Таким образом, он не виден в тексте программы, но он существует, и у него есть вызовы к различным функциям во время запуска.
Также есть ldd
Утилита, которая показывает все динамические библиотеки, используемые исполняемым файлом:
ldd main
linux-gate.so.1 => (0xb7724000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7547000)
/lib/ld-linux.so.2 (0xb7725000)
Таким образом, любая из связанных с исполняемыми файлами библиотек может использовать malloc().