Text
This commit is contained in:
108
wiki/Prog/Development/PVS-Studio.md
Normal file
108
wiki/Prog/Development/PVS-Studio.md
Normal file
@ -0,0 +1,108 @@
|
||||
---
|
||||
title: PVS-Studio
|
||||
category: Программирование
|
||||
tags: программирование, C, C++, отладка
|
||||
summary:
|
||||
toc: yes
|
||||
...
|
||||
|
||||
[TOC]
|
||||
|
||||
### Информация и лицензия
|
||||
|
||||
[PVS-Studio](https://www.viva64.com/ru/pvs-studio/) — это инструмент для
|
||||
статического анализа исходного кода программ, написанных на языках С, C++.
|
||||
|
||||
Для использования в Linux нужно чтобы в каталоге `~/.config/PVS-Studio`
|
||||
находился лицензионный ключ или в начале исходных файлов с расширениями
|
||||
`*.c`, `*.cpp`, `*.cxx` и т.п. [присутствовали строки](https://www.viva64.com/ru/b/0457/)
|
||||
|
||||
```
|
||||
// This is an independent project of an individual developer. Dear PVS-Studio, please check it.
|
||||
|
||||
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
||||
```
|
||||
|
||||
### Настройка и компиляция проекта
|
||||
|
||||
Полное руководство для работы в Linux находится
|
||||
[здесь](https://www.viva64.com/ru/m/0036/), а ниже приведён список типовых команд.
|
||||
|
||||
Настройка проекта для CMake:
|
||||
|
||||
```sh
|
||||
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=On <src-tree-root>
|
||||
```
|
||||
|
||||
Сборка проекта с помощью `make`:
|
||||
|
||||
```sh
|
||||
pvs-studio-analyzer trace -- make -j$(nproc)
|
||||
```
|
||||
|
||||
Настройка и сборка проекта с использованием Ninja:
|
||||
|
||||
```sh
|
||||
cmake -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=On <src-tree-root>
|
||||
ninja -t compdb
|
||||
```
|
||||
|
||||
### Анализ проекта
|
||||
|
||||
Для анализа проектов используется утилита `pvs-studio-analyzer`. По умолчанию
|
||||
включены только диагностики общего назначения (General Analysis, GA).
|
||||
Включить дополнительные правила можно с помощью опции `-a`:
|
||||
|
||||
```
|
||||
-a [MODE], --analysis-mode [MODE]
|
||||
MODE defines the type of warnings:
|
||||
1 - 64-bit errors;
|
||||
2 - reserved;
|
||||
4 - General Analysis;
|
||||
8 - Micro-optimizations;
|
||||
16 - Customers Specific Requests;
|
||||
32 - MISRA.
|
||||
Modes can be combined by adding the values
|
||||
Default: 4
|
||||
```
|
||||
|
||||
Выбор типов предупреждений осуществляется на основе побитовой маски из
|
||||
приведенных выше типов. Чтобы выполнить анализ, исключив проверки MISRA,
|
||||
нужно выполнить
|
||||
|
||||
```sh
|
||||
pvs-studio-analyzer analyze -a 29 -j$(nproc) -o pvs.log
|
||||
```
|
||||
|
||||
Составление отчёта для просмотра в Qt Creator:
|
||||
|
||||
```sh
|
||||
plog-converter -t tasklist -o pvs.tasks pvs.log
|
||||
```
|
||||
|
||||
При составлении отчёта уровень детализации можно изменять с помощью ключа
|
||||
`-a` (`--analyzer`), который производит фильтрацию предупреждений согласно
|
||||
маске, которая имеет вид `MessageType:MessageLevels`, где `MessageType`
|
||||
может принимать один из следующих типов: `GA`, `OP`, `64`, `CS`, `MISRA`,
|
||||
а `MessageLevels` может принимать значения от `1` до `3`.
|
||||
Возможна комбинация разных масок через `;`. Например, при составлении
|
||||
отчёта для просмотра в формате HTML можно повысить уровень детализации:
|
||||
|
||||
```sh
|
||||
plog-converter -t fullhtml -a "GA:1,2,3;64:1;OP:1,2;CS:1,2" -o html pvs.log
|
||||
```
|
||||
|
||||
Составление отчёта для редактора Vim:
|
||||
|
||||
```sh
|
||||
plog-converter -a "GA:1,2" -t errorfile -o pvs.err pvs.log
|
||||
```
|
||||
|
||||
Для просмотра отчёта в редакторе Vim нужно открыть файл `pvs.err` и выполнить команды:
|
||||
|
||||
```vim
|
||||
:set makeprg=cat\ % " выбор программы для компиляции в текущей сессии
|
||||
:silent make " имитация сборки
|
||||
:cw " открытие результатов в нижнем окне
|
||||
```
|
||||
|
35
wiki/Prog/Development/Подбор ключей компиляции GCC.md
Normal file
35
wiki/Prog/Development/Подбор ключей компиляции GCC.md
Normal file
@ -0,0 +1,35 @@
|
||||
---
|
||||
title: Подбор ключей компиляции GCC
|
||||
category: Программирование
|
||||
tags: программирование, C, C++, отладка, оптимизация
|
||||
summary:
|
||||
...
|
||||
|
||||
Подбор ключей компиляции основан на измерениях характеристик во
|
||||
время выполнения программы. На первом этапе создаётся исполняемый
|
||||
файл `program`, в который включается информация для профилировки.
|
||||
Ключ `-fprofile-generate=data/pgo` указывает, что нужно собирать
|
||||
информацию и сохранять в каталог `data/pgo`. Компиляцию следует
|
||||
выполнять в последовательном режиме.
|
||||
|
||||
```sh
|
||||
env CXXFLAGS='-fprofile-generate=data/pgo' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
|
||||
make -j1
|
||||
```
|
||||
|
||||
После компиляцию программу следует выполнить, придерживаясь
|
||||
типичного сценария использования.
|
||||
|
||||
```sh
|
||||
./program
|
||||
```
|
||||
|
||||
Скомпилировать программу с использованием полученной статистики.
|
||||
Для многопоточной программы следует указать флаг `-fprofile-correction`,
|
||||
чтобы скорректировать данные, которые могут неустойчивыми из-за пропусков
|
||||
обновлений счётчиков. Компиляцию следует выполнять в последовательном режиме.
|
||||
|
||||
```sh
|
||||
env CXXFLAGS='-fprofile-use=data/pgo -fprofile-correction' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
|
||||
make -j1
|
||||
```
|
55
wiki/Prog/Development/Профилирование кода.md
Normal file
55
wiki/Prog/Development/Профилирование кода.md
Normal file
@ -0,0 +1,55 @@
|
||||
---
|
||||
title: Профилирование кода
|
||||
category: Программирование
|
||||
tags: программирование, отладка, производительность, профилирование, gprof
|
||||
summary:
|
||||
...
|
||||
|
||||
## Общее описание
|
||||
|
||||
Чтобы профилировать приложения, компилируемые [GCC](http://gcc.gnu.org),
|
||||
необходимо добавлять флаг `-fno-omit-frame-pointer` и желательно `-g`.
|
||||
|
||||
## quickstack
|
||||
|
||||
Утилита для отслеживания стеков вызовов функций [quicktrack](https://github.com/yoshinorim/quickstack).
|
||||
Пример использования:
|
||||
|
||||
```sh
|
||||
quickstack -f -p $(pidof application)
|
||||
```
|
||||
|
||||
## perf
|
||||
|
||||
Утилита профилирования для ядра Linux (находится в дереве его исходных текстов
|
||||
в каталоге `tools/perf`).
|
||||
|
||||
Полезные ссылки:
|
||||
|
||||
* [Официальная страница](https://perf.wiki.kernel.org/index.php/Main_Page)
|
||||
* [Примеры](https://stackoverflow.com/questions/1777556/alternatives-to-gprof/10958510#10958510)
|
||||
* [Примеры](http://www.brendangregg.com/perf.html)
|
||||
|
||||
|
||||
## Systemtap
|
||||
|
||||
[Установка и простые примеры использования SystemTap](https://eax.me/systemtap/)
|
||||
|
||||
|
||||
## Valgrind
|
||||
|
||||
|
||||
## gperftools
|
||||
|
||||
|
||||
## Разное
|
||||
|
||||
* [Профилирование кода на C/C++ в Linux и FreeBSD](https://eax.me/c-cpp-profiling/)
|
||||
* [Примеры](http://gernotklingler.com/blog/gprof-valgrind-gperftools-evaluation-tools-application-level-cpu-profiling-linux/)
|
||||
|
||||
|
||||
## Графическое отображение
|
||||
|
||||
* [Flame Graphs](http://www.brendangregg.com/flamegraphs.html)
|
||||
* [gprof2dot](https://github.com/jrfonseca/gprof2dot)
|
||||
|
Reference in New Issue
Block a user