Непонятный вывод из Kcachegrind - PullRequest
0 голосов
/ 09 ноября 2011

введите описание ссылки здесь

Привет, Я профилирую свой код C с помощью Kcachegrind Но меня смущает выходное древовидное представление графа вызовов (см. Вышеупомянутую ссылку). Я скомпилировал код: valgrind --tool = callgraph ./Program_name, а затем kcachegrind callgrind.out.8389. У меня есть следующие вопросы:

  1. Над функцией main () вы увидите функции «under main ()» и 0x08048bb0. Что это? Это потому, что компилятор / ОС не загружает образ программы и напрямую переходит к main (). Я прочитал, что перед вызовом main () процесс выполняет большую часть кода, чтобы «очистить пространство для выполнения». Это причина?

  2. В нижней части дерева вы также увидите множество функций с шестнадцатеричными числами вместо имен. Почему это?

  3. Являются ли эти шестнадцатеричные числа абсолютными адресами (т. Е. Не смещенными) или виртуальными адресами (или символами) раздела кода этих функций? или нет?

  4. Я скомпилировал свою программу в Ubuntu 10.10, используя опцию -g. Связаны ли эти шестнадцатеричные числа с отсутствием «отладочной информации»?

  5. Я пытался использовать "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
  1. Я не вижу шестнадцатеричные адреса из графа вызовов, присутствующего в выходе "nm". Я в замешательстве.

Пожалуйста, помогите мне.

Bye.

1 Ответ

1 голос
/ 09 ноября 2011

Узлы выше main соответствуют коду, который вызывает main и возвращает ее.Это код, который инициализирует и очищает глобальные переменные.

Функции с шестнадцатеричными числами вместо имен соответствуют местам, где отладочная информация или информация о стеке была недоступна.Если вы заметили, они обычно находятся внутри или между библиотеками.Адреса являются абсолютными, виртуальными адресами.Вы не найдете их в своей программе, потому что они либо находятся в динамически загружаемых библиотеках без отладочной информации, либо были перемещены, либо находятся в частях вашей программы, которые не были скомпилированы с символами отладки (например, код изстатические библиотеки).Если бы их было так легко найти, они были бы найдены для вас автоматически.

В любом случае они составляют только около 12% от общего потребления.Они между кодом SQL и кодом XML.

...