Основываясь на моем понимании, утилита ltrace используется для отслеживания вызовов библиотеки. I ltrace простая программа, которая вызывает только printf
, но то, что отображается в библиотечной функции, - puts
вместо printf
. Мне любопытно, почему он не показывает printf
, но puts
?ltrace printf() но показывает puts()
ответ
ltrace
показывает puts
, вызываемый, потому что он работает в двоичном файле и вызывает двоичный файл puts
.
Example: Источник:
#include <stdio.h>
int main(int c, char *v[])
{
printf("hello world\n");
}
Монтаж:
.LC0:
.string "hello world"
main:
subq $8, %rsp
movl $.LC0, %edi
call puts
xorl %eax, %eax
addq $8, %rsp
ret
Если вы играете с большим количеством примеров, вы можете обнаружить, что компилятор производит ассемблерный код, который вызывает memcpy
когда исходный код не делает, код сборки, который не вызывает memcpy
(или одну из многих других общих функций), когда выполняется исходный код, и так далее. Компилятор должен только учитывать смысл программы, и не нужно уважать вызываемые функции. Поскольку printf
и puts
являются стандартными функциями, которые вам не разрешено переопределять, он знает, что эти функции делают и могут заменить один на другой, если он сочтет это полезным.
Здесь puts
был заменен на printf
потому puts
проще (не интерпретировать %
форматов и не VARIADIC), и, следовательно, быстрее. В этом случае компилятору было позволено заменить printf
на puts
, потому что для печати строки не требовалась интерпретация любого спецификатора формата, и строка закончилась в \n
.
Это просто оптимизация. Компилятор заменяет printf("smth\n")
на puts("smth")
, потому что результат тот же, но puts()
должен работать быстрее.
- 1. C - printf() не работает, но puts() работает нормально
- 2. Массив символов в C (Puts vs printf)
- 3. Разница между printf @ plt и puts @ plt
- 4. Странные сообщения printf и puts объясняются
- 5. Почему это показывает, когда я разбираю независимо от того, использую ли я printf или puts?
- 6. gets() и puts() показывает символы, которые я не вводил
- 7. Все еще доступно с помощью puts и printf
- 8. В чем разница между printf() и puts() в C?
- 9. Зачем использовать printf («mystring \ n») вместо просто puts («mystring»)?
- 10. building ltrace для android
- 11. Build ltrace для Android
- 12. ltrace эквивалент для osx?
- 13. программа в C запускает правильно, но printf ничего не показывает
- 14. Как реализовать функцию puts()?
- 15. Использование puts в файле
- 16. OMAP: Строительство и установка ltrace
- 17. ltrace печатает только два вызова
- 18. GNU, как, ставит произведения, но Printf не
- 19. Printf делает ошибку и не показывает результата
- 20. Почему printf не показывает правильный массив?
- 21. dup2: write() перенаправлено, но не fprintf() или puts()
- 22. printf («% + f», ..) все еще показывает отрицательное число
- 23. ld_preload printf использовать stderr вместо stdout
- 24. Просмотр результата, возвращаемого запросом «puts»
- 25. Как работают функции puts и gets?
- 26. Как использовать ltrace для программ mpi?
- 27. Как использовать ltrace с подстановочными знаками
- 28. Make puts thread-safe
- 29. «Скрытие» системного вызова от ltrace и strace
- 30. Printf не отображает переменную, но случайное число
Спасибо за ваш ответ. Могу ли я узнать, что такое отношения между printf и помещается здесь? – HuangJie
@HuangJie 'puts' проще (и, следовательно, быстрее), потому что он не интерпретирует никаких индикаторов формата'% '. И он добавляет '\ n' в конце сам по себе. –