Как strace должен использоваться?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

265
задан doru 23 May 2015 в 09:35
поделиться

8 ответов

Обзор
Strace strace может рассматриваться как отладчик легкого веса. Это позволяет программисту / пользователь быстро узнавать, как программа взаимодействует с ОС. Это делает это вызовами системы контроля и сигналами.

Использование
Хороший для того, когда у Вас нет исходного кода или не хотеть быть побеспокоенными для реального прохождения через него.
кроме того, полезный для Вашего собственного кода, если Вы не испытываете желание открывать GDB, но просто интересуетесь пониманием внешнего взаимодействия.

А хорошее небольшое введение
я столкнулся с этим введением к использованию strace просто на днях: strace привет мир

181
ответ дан infrared 23 November 2019 в 02:28
поделиться

В простых словах strace прослеживает все системные вызовы, выпущенные программой наряду с их кодами возврата. Думайте вещи, такие как операции файла/сокета и намного более неясные.

является самым полезным, если бы у Вас есть некоторое практическое знание C с тех пор здесь, системные вызовы более точно обозначали бы вызовы стандартной библиотеки для C.

Скажем, Ваша программа является/usr/local/bin/cough. Просто используйте:

strace /usr/local/bin/cough <any required argument for cough here>

или

strace -o <out_file> /usr/local/bin/cough <any required argument for cough here>

для записи в 'out_file'.

Весь вывод strace перейдет к stderr (остерегайтесь, чистый объем его часто просит перенаправление в файл). В самых простых случаях Ваша программа прервется с ошибкой, и Вы будете в состоянии видеть что где ее последние взаимодействия с ОС в выводе strace.

[еще 119] информация должна быть доступной с:

man strace
61
ответ дан gsamaras 23 November 2019 в 02:28
поделиться

strace перечисляет весь системные вызовы сделанный процессом, к этому относятся. Если Вы не будете знать то, что означают системные вызовы, Вы не будете в состоянии получить много пробега от него.

, Тем не менее, если Ваша проблема включает файлы или пути или значения среды, работая strace на проблематичной программе и перенаправляя вывод в файл и затем захватывая тот файл для Вашей строки пути/файла/ENV, может помочь Вам видеть то, что Ваша программа на самом деле попытка сделать, в отличие от того, к чему Вы ожидали его.

36
ответ дан Asaf Bartov 23 November 2019 в 02:28
поделиться

Strace выделяется как инструмент для исследования производственных систем, где Вы не можете позволить себе запустить эти программы под отладчиком. В частности, мы использовали strace в следящем за двумя ситуациями:

  • нечто Программы, кажется, находится в мертвой блокировке и стало безразличным. Это могло быть целью для gdb; однако, мы не всегда имели исходный код или иногда имели дело с языками в виде сценария, которые не были просты для выполнения под отладчиком. В этом случае Вы выполняете strace на уже запускающей программе, и Вы получите список сделанных системных вызовов. Это особенно полезно при исследовании клиент-серверного приложения или приложения, которое взаимодействует с базой данных
  • Исследование, почему программа является медленной. В частности, мы только что переместились в новую распределенную файловую систему, и новая пропускная способность системы была очень медленной. Можно определить strace с '-T' опция, которая скажет Вам, сколько времени было проведено в каждом системном вызове. Это помогло определить, почему файловая система вызывала вещи замедлиться.

Для примера анализа использования strace видят мой ответ на этот вопрос .

17
ответ дан Community 23 November 2019 в 02:28
поделиться

Strace является инструментом, который говорит Вам, как Ваше приложение взаимодействует с Вашей операционной системой.

Это делает это путем сообщения Вам, какие системные вызовы ОС Ваше использование приложения и с тем, какие параметры это называет ими.

Так, например, Вы видите, за какими файлами Ваши попытки программы открыться и выдержать вызов следуют.

можно отладить все виды проблем с этим инструментом. Например, если в приложении говорится, что оно не может найти библиотеку, что Вы знаете об установке Вас, strace сказал бы Вам, где приложение ищет тот файл.

И это - просто верхушка айсберга.

4
ответ дан Luka Marinko 23 November 2019 в 02:28
поделиться

Вот некоторые примеры того, как я использую strace для рытья в веб-сайты. Надежда это полезно.

Проверка на время до первого байта как так:

time php index.php > timeTrace.txt

Видят, какой процент действий делают что. Много из lstat и fstat могло быть признаком, что пора очистить кэш:

strace -s 200 -c php index.php > traceLstat.txt

Выводы trace.txt, таким образом, Вы видите точно, какие вызовы выполняются.

strace -Tt -o Fulltrace.txt php index.php

Использование это, чтобы начать работу, взяло ли что-нибудь между .1 к .9 из секунды для загрузки:

cat Fulltrace.txt | grep "[<]0.[1-9]" > traceSlowest.txt

Видят, какие пропавшие без вести файлов или каталогов были пойманы в strace. Это произведет много материала, включающего нашу систему - единственные соответствующие биты включают файлы клиента:

strace -vv php index.php 2>&1 | sed -n '/= -1/p' > traceFailures.txt
1
ответ дан 23 November 2019 в 02:28
поделиться

strace - хороший инструмент для изучения того, как ваша программа выполняет различные системные вызовы (запросы к ядру), а также сообщает о неудачных вызовах вместе со значением ошибки, связанной с этим отказом. Не все сбои - это ошибки. Например, код, который пытается найти файл, может получить ошибку ENOENT (Нет такого файла или каталога), но это может быть приемлемым сценарием в логике кода.

Одним из хороших вариантов использования strace является для отладки условий гонки во время создания временного файла. Например, программа, которая может создавать файлы, добавляя идентификатор процесса (PID) к некоторой заранее заданной строке, может столкнуться с проблемами в многопоточных сценариях. [PID + TID (идентификатор процесса + идентификатор потока) или лучший системный вызов, такой как mkstemp, исправит это].

Это также хорошо для отладки сбоев.

4
ответ дан 23 November 2019 в 02:28
поделиться

Strace можно использовать как инструмент отладки или как примитивный профилировщик.

В качестве отладчика вы можете видеть, как заданные системные вызовы вызывались, выполнялись и что они возвращали. Это очень важно, так как позволяет увидеть не только то, что программа не удалась, но и ПОЧЕМУ программа потерпела неудачу. Обычно это просто результат плохого кодирования, не улавливающего все возможные результаты программы. В других случаях это просто жестко запрограммированные пути к файлам. Без strace вы можете угадать, что пошло не так, где и как. Используя strace, вы получаете разбивку системного вызова, обычно простой просмотр возвращаемого значения говорит о многом.

Еще одно применение - профилирование. Вы можете использовать его для измерения времени выполнения каждого системного вызова индивидуально или как совокупность. Хотя этого может быть недостаточно для решения ваших проблем, это, по крайней мере, значительно сузит список потенциальных подозреваемых. Если вы видите много пар fopen / close в одном файле, вы, вероятно, излишне открываете и закрываете файлы при каждом выполнении цикла, вместо того, чтобы открывать и закрывать его вне цикла.

Ltrace - близкий родственник Strace, тоже очень полезный. Вы должны научиться различать ваши узкие места. Если общее выполнение составляет 8 секунд, а вы тратите всего 0,05 секунды на системные вызовы, то анализ программы не принесет вам много пользы, проблема в вашем коде, который обычно является логической проблемой, или программе действительно требуется чтобы бежать так долго.

Самая большая проблема strace / ltrace - это чтение их вывода. Если вы не знаете, как выполняются вызовы, или хотя бы имена системных вызовов / функций, будет сложно расшифровать значение. Знание того, что возвращают функции, также может быть очень полезным, особенно для разных кодов ошибок. Хотя расшифровывать это сложно, иногда они действительно возвращают жемчужину знаний; однажды я увидел ситуацию, когда у меня закончились inodes, но не осталось свободного места, поэтому все обычные утилиты не выдали мне никаких предупреждений, я просто не мог создать новый файл. Чтение кода ошибки из вывода strace указала мне правильное направление.

6
ответ дан 23 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: