Непонятный вывод из Kcachegrind
Привет, я профилирую свой код на C с помощью Kcachegrind. Но меня смущает выходное древовидное представление графа вызовов (см. Вышеупомянутую ссылку). Я скомпилировал код: valgrind --tool=callgraph ./Program_name и затем kcachegrind callgrind.out.8389. У меня есть следующие вопросы:
Над функцией main() вы увидите функции "ниже main()" и 0x08048bb0. Что это? Это потому, что компилятор / ОС не загружает образ программы и напрямую переходит к main(). Я прочитал, что перед вызовом main() процесс выполняет большую часть кода, чтобы "очистить пространство для выполнения". Это причина?
В нижней части дерева вы также увидите множество функций с шестнадцатеричными числами вместо имен. Почему это?
Являются ли эти шестнадцатеричные числа абсолютными адресами (т.е. не смещенными) или виртуальными адресами (или символами) раздела кода этих функций? или нет?
Я скомпилировал свою программу в Ubuntu 10.10, используя опцию -g. Эти шестнадцатеричные числа имеют какое-то отношение к отсутствию "отладочной информации"?
Я пытался использовать "nm program_name", чтобы выяснить, что происходит? Для приведенного выше графа вызовов у меня есть следующий вывод:
root@xTR:/home/ahuq/system/client/xTR# nm UDPClientProject 0804af14 d _DYNAMIC 0804aff4 d _GLOBAL_OFFSET_TABLE_ 08049b4c R _IO_stdin_used w _Jv_RegisterClasses 0804af04 d __CTOR_END__ 0804af00 d __CTOR_LIST__ 0804af0c D __DTOR_END__ 0804af08 d __DTOR_LIST__ 08049ebc r __FRAME_END__ 0804af10 d __JCR_END__ 0804af10 d __JCR_LIST__ 0804b0a0 A __bss_start U __cxa_atexit@@GLIBC_2.1.3 0804b098 D __data_start 08049b00 t __do_global_ctors_aux 08048c30 t __do_global_dtors_aux 0804b09c d __dso_handle 08048be0 T __gmon_start__ 08049aba T __i686.get_pc_thunk.bx 0804af00 d __init_array_end 0804af00 d __init_array_start 08049a50 T __libc_csu_fini 08049a60 T __libc_csu_init U __libc_start_main@@GLIBC_2.0 U __monstartup@@GLIBC_2.0 U __stack_chk_fail@@GLIBC_2.4 0804b0a0 A _edata 0804b0c4 A _end 08049b2c T _fini 08049b48 R _fp_hw 0804890c T _init U _mcleanup@@GLIBC_2.0 08048bb0 T _start 080490aa T access_file_insert_data U alarm@@GLIBC_2.0 0804922d T append 08049ac0 T atexit U bzero@@GLIBC_2.0 0804b0a4 b called.3477 U calloc@@GLIBC_2.0 U ceil@@GLIBC_2.0 08049517 T client_timeout_signal_handle 0804b0a8 b completed.7065 0804b098 W data_start 080496e5 T delete_query 080494cc T display 0804b0ac b dtor_idx.7067 0804b0b4 B err 08049658 T err_message 08049b48 A etext U exit@@GLIBC_2.0 U fclose@@GLIBC_2.1 U fgets@@GLIBC_2.0 U fopen@@GLIBC_2.1 U fprintf@@GLIBC_2.0 08048c90 t frame_dummy 0804953a T get_map_notify_packet U htons@@GLIBC_2.0 U inet_pton@@GLIBC_2.0 08049733 T insert_query 08048cb4 T main U malloc@@GLIBC_2.0 080495c6 T map_notify_packet_initialization 08048f3c T map_register_packet_initialization U mcount@@GLIBC_2.0 U memcpy@@GLIBC_2.0 U memset@@GLIBC_2.0 U mysql_close@@libmysqlclient_16 U mysql_errno@@libmysqlclient_16 U mysql_error@@libmysqlclient_16 U mysql_init@@libmysqlclient_16 U mysql_query@@libmysqlclient_16 U mysql_real_connect@@libmysqlclient_16 U mysql_sqlstate@@libmysqlclient_16 0804b0c0 B num_of_mapping U perror@@GLIBC_2.0 0804b0b0 B position U printf@@GLIBC_2.0 U puts@@GLIBC_2.0 U recvfrom@@GLIBC_2.0 U sendto@@GLIBC_2.0 U signal@@GLIBC_2.0 U socket@@GLIBC_2.0 0804b0a0 B stderr@@GLIBC_2.0 U strcat@@GLIBC_2.0 U strcpy@@GLIBC_2.0 U strlen@@GLIBC_2.0 U strtok@@GLIBC_2.0 08049781 T tcp_server_access_main 0804b0b8 B udp_cli_program_cycle 0804b0bc B xx1
- Я не вижу шестнадцатеричных адресов из графа вызовов, присутствующего в выходе "nm". Я сбит с толку.
Пожалуйста, помогите мне.
До свидания.
1 ответ
Узлы выше main соответствуют коду, который вызывает main и возвращает ее. Это код, который инициализирует глобальные переменные и очищает их.
Функции с шестнадцатеричными числами вместо имен соответствуют местам, где отладочная информация или информация о стеке была недоступна. Если вы заметили, они, как правило, внутри или между библиотеками. Адреса являются абсолютными, виртуальными адресами. Вы не найдете их в своей программе, потому что они либо находятся в динамически загружаемых библиотеках без отладочной информации, либо были перемещены, либо находятся в частях вашей программы, которые не были скомпилированы с символами отладки (такими как код из статические библиотеки). Если бы их было так легко найти, они были бы найдены для вас автоматически.
В любом случае, они составляют только около 12% потребления, всего. Они между кодом SQL и кодом XML.