разработчикам
Вывод описания ошибки в стандартном assert
Стандартный макрос assert() в C применяется для внутренних допущений в фунции, которые всегда должны выполнятся. Иначе они являются последствиями программной ошибки. Например вызов фунции не с тем параметром или повредилась память.
Но этот макрос неудобен тем что выводит только условие срабатывания макроса, и нельзя вставить описание ошибки. Выйти из этого положения можно использую трюк с добавлением к условию самого сообщения.
Например имеем файлик assert.c:
#include <stdio.h> #include <assert.h> int main() { assert(2 + 2 == 4 && "описание ошибки если 2 + 2 не равно 4"); assert(2 + 2 == 5 && "описание ошибки если 2 + 2 не равно 5"); return 0; }
Тестируем что получится:
ramok@~tests/ make assert && ./assert
cc -W -Wall assert.c -o assert
assert: assert.c:7: main: Assertion `2 + 2 == 5 && "описание ошибки если 2 + 2 не равно 5"' failed.
[1] 29464 abort (core dumped) ./assertКомпиляция в VIM
Иногда пишем программку (на пример,на Си) и, с целю отслеживания ошибок, компилируем её часто в ходе написания. Чтобы ускорить процесс можно в конфигурационном файле подвесить на горячую клавишу примерно следующее действие:
noremap <S-F9> :!cc -o %< %
Разбор полетов:
S-F9 - по SHIFT-F9
:!cc - запускаем С компилятор
% - имя текущего файла
%< - имя текущего файла без расширения
Таким образом, допустим, редактируем onefile.c . По нажатию SHIFT-F9 в текущей директории выполняется:
cc -o onefile onefile.c
Получаем бинарник с именем = "имя редактируемого файла" без расширения ".с".
VIM. C. В теле какой функции расположен курсор?
Изучая чужие исходники на С, иногда, курсор попадает в большую функцию не помещающуюся целиком в терминальном окне.
Требуется: максимально быстро определить в пределах какой функции находится курсор.
Варианты действий:
1.
- Прыжок к заголовку функции
[[[/code]
- Прыжок назад в исходную позицию [code]''
2.
Берём из атачмента скрипт и записываем его в ~/.vim/plugin:
% cp Cfname.vim.txt ~/.vim/plugin/Cfname.vim
Получаем следующие горячие клавиши:
- ff - В командной строке показывается прототип функции
- fb - Прыжок к началу функции
- fe - Прыжок в конец функции
- ft - Прыжок в позицию, в которой курсор находился до fb и fe
- fs - Включает новый статусбар, на котором (в режиме онлайн) отображается имя функции, в теле которой находится курсор. Данная фича заставляет очень сильно тормозить Vim, при редактировании больших файлов
Кросскомпиляция Win/Qt приложений на Linux
При разработке приложений на Qt, основным преимуществом является кроссплатформенность. Однако, если вы работаете на Linux машине, для тестирования работоспособности Windows версии понадобится Windows окружение. Эта статья расскажет о том как можно тестировать Win/Qt приложения на Linux.
Директории поиска программ, инклюдов и библ gcc
gcc -print-search-dirs
выдаст директории в которых будет производится поиск компонентов для сборки программ и библиотек
Brainfuck - язык программирования для мазохистов
Забавный язык программирования, имеющий всего лишь восемь команд, каждая из которых записывается одним символом. Программа на Brainfuck управляет абстрактной машиной (очень напоминающей машину Тюринга) + пара команд для общения с внешним миром.
Пример программки Hello World:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++ .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++. ------.--------.>+.>.
Ссылки:
Brainfuck -Wiki
Оригинальное описание BF на английском языке и ссылки на BF-ресурсы
интерпретатор на Java
Русское ЖЖ сообщество Brainfucker'ов
изменение Makefile.am для установки стартовый скриптов и конфигурационных
разрабатывая проекты в kdevelop я столкнулся с невозможностью гуевыми средствами заставить configure генерировать Makefile который бы инсталировал стартовые скрипты и конфигурационные файлы. методом научного тыка такого удалось достич записав к Makefile.am следующие строки:
init_SCRIPTS = bcipserv.sh initdir=/etc/init.d mainconfdir=/etc mainconf_DATA = bcipserv.conf
В результате при вызове make install файл bcipserv.sh падает в директорию /etc/init.d, а bcipserv.conf в /etc. По аналогии можно сделать установку необходимых файлов и в другие директории
создание собственных стартовый скриптов в debian
Для написания стартовых скриптов в debian по совету ramok можно использовать темплейт /etc/init.d/skeleton, предварительно прочитав /etc/init.d/README.
Не забываем указать запуск скрита с помощью update-rc.d
Модуль perl для отладочного вывода сложных типов данных
Если вы пишите на perl что нибуть сложнее однострочников, часто спасательным кругом становится модуль Data::Dumper.
Этот модуль очень полезен как для отладки и так и при разборе чужих программ и позволяет выводить содержимое любых сложных стукрур данных со всем их содержимым.
Например разбираемся в программе и видим что из модуля возвращается массив @data в котором находятся нужные нам данные.
Выводим его с помощью
use Data::Dumper; print STDERR Dumper @data;
и видим что то типа
$VAR1 = {
'TS' => '13550361229',
'INDEX' => 1,
'FL' => 1,
'TD' => '73728',
'DT' => 'addr'
};
$VAR2 = {
'TS' => '13550484957',
'INDEX' => 2,
'TD' => '82944',
'FR' => 1,
'DT' => 'mps'
};
...
$VAR346 = {
'TS' => '13619541826',
'INDEX' => 346,
'TD' => '89088',
'FR' => 1,
'DT' => 'mps_ack'
};Ага. Сразу видно что это массив из хешей, и сразу видно и размер массива, и ключи в хешах и что по ним находится.
Как просмотреть все макросы по умолчанию определенные gcc
Иногда полезно узнать какие макросы предоставляет gcc по умолчанию.
$ touch test.h ;gcc -v -E -dM test.h ; rm test.h
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure linux gnu
Thread model: posix
gcc version 4.3.1 20080309 (prerelease) (Debian 4.3.0-1)
COLLECT_GCC_OPTIONS='-v' '-E' '-dM' '-mtune=generic'
/usr/lib/gcc/i486-linux-gnu/4.3.1/cc1 -E -quiet -v test.h -mtune=generic -dM
ignoring nonexistent directory "/usr/local/include/i486-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/i486-linux-gnu/4.3.1/../../../../i486-linux-gnu/include"
ignoring nonexistent directory "/usr/include/i486-linux-gnu"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.3.1/include
/usr/lib/gcc/i486-linux-gnu/4.3.1/include-fixed
/usr/include
End of search list.
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __DEC64_DEN__ 0.000000000000001E-383DD
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 2147483647
...Чем отличаются уровни оптимизации -O в gcc?
В gcc 4.3 появилась интересная полезность: у флажка --help появились параметры, один из который --help=optimizers выводит флажки оптимизации для текущих ключей.
Вот такой вот командой можно узнать чем например отличаются уровни отпимизации -O2 от -O3
$ diff -u <(gcc -c -Q -O2 --help=optimizers) <(gcc -c -Q -O3 --help=optimizers) | sed -ne 's/^+ //p'
-fgcse-after-reload [enabled]
-finline-functions [enabled]
-fpredictive-commoning [enabled]
-ftree-vectorize [enabled]
-funswitch-loops [enabled]
$Работа с исходным кодом не выходя из gdb
Команды удобные для работы с исходным кодом прямо из gdb.
1. Команда edit: редактировать файла на месте
Указать нужный редактор можно в переменной окружения EDITOR.
У меня указано в ~/.zshrc EDITOR=vim, и прекрасно все работает.
http://sourceware.org/gdb/current/onlinedocs/gdb_8.html#SEC54
2. Команда make: запуск make прямо из gdb
Удобно после подправки исходника, пересобрать проект.
http://sourceware.org/gdb/current/onlinedocs/gdb_3.html#SEC12
Встроенный текстовый интерфейс в gdb
В gdb существует встроенный текстовый интерфейс для отображения исходников, дизассемблированного кода и состояния регистров.
Для этого нужно запустить gdb с ключиком -tui или просто запустить gdbtui можно вызвать из командной строки gdb сочетанием клавиш ctrl-x a.

Есть возможность переключатся в одно и двух оконный режим. Клавиши ctrl-x 1 и ctrl-x 2 соответственно.
Подробности тут, хотя там больше особо интересного и нет Ж:-)
разбор параметров командной строки в скриптах с помощью getopts
для разбора параметров в скриптах чаще всего используются две программы - getopt и getopts
первая для начала довольно сложна и излишне функциональна, поэтому рассмотрим разбор на примере более простой getopts
стандартный скелет скрипта
#!/bin/sh # while getopts OPTIONS_LIST option do case $option in OPTION) ACTION;; esac done shift $((OPTIND - 1)) ### ТЕЛО СКРИПТА ###
getopts понимает только простые однобуквенные опции, либо вообще без, либо с обязательным аргументом.
все опции, которые программа должна обрабатывать указываются вместо OPTIONS_LIST. если опция требует обязательный параметр, то после ее буквы надо поставить двоеточие.
ПРИМЕР: rvo:x
такая строчка показывает, что надо обрабатывать опции -r, -v, -o и -x, причем -o требует аргумента.
далее указывается переменная, куда будет сохранятся найденная опция. в данном случае это option

