The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

C/C++, сборка, отладка

   Корень / Программисту и web-разработчику / C/C++, сборка, отладка

----* Использование LTTng для прозрачной трассировки приложений в Ubuntu Linux (доп. ссылка 1)   [комментарии]
  Система трассировки LTTng (http://lttng.org/) работает на уровне Linux-ядра и отличается минимальным влиянием на работу профилируемого приложения, что позволяет приблизить условия работы данного приложения к его выполнению без использования трассировки (например, позволяет выявлять проблемы с производительностью в программах, работающих в реальном режиме времени).
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как подружить plPlot и wxWidgets под ОС Windows   Автор: KoD  [комментарии]
  ++ 0) Введение.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Создание программ под SynapseOS   Автор: Арен Елчинян  [комментарии]
  Пример создания приложения "Hello World", используя clang и сисфункцию вывода для [[https://github.com/0Nera/SynapseOS SynapseOS]].
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Тестирование хелловорлда под 17 платформ одним скриптом   Автор: Урри  [комментарии]
  В заметке рассказано как собрать и, главное, запустить и протестировать свой хелловорлд сразу под 17 платформ (29 вариантов сборки, так как почти каждая платформа идёт в двух вариантах: libc и musl) не создавая зоопарк виртуалок. Все желаемое осуществляется с помощью сборочного инструментарий void-linux, за что им огромное спасибо - работа проделана огромная.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Sonatype Nexus как Maven proxy (доп. ссылка 1)   Автор: ACCA  [комментарии]
 
При попытке установить, например,
com.google.protobuf:protoc:exe:linux-x86_64:2.6.1, получаете ошибку:

   Return code is: 400, ReasonPhrase: Detected content type [application/x-executable], but expected [application/x-dosexec]: com/google/protobuf/protoc/2.6.1/protoc-2.6.1-linux-x86_64.exe

В настройке репозитория maven2(proxy) есть незаметная галочка "Validate that
all content uploaded to this repository is of a MIME type appropriate for the
repository format".

Её выключение решает проблему, так как Nexus и Maven Central по-разному назначают MIME type.
 
----* Запись бинарных данных в секцию ELF   Автор: 赤熊  [комментарии]
  Стоит задача - в программе запрятать бинарные данные. Допустим архив.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Оценка стоимости сборки Android 5 (x86-64) на облачных серверах Amazon EC2 (доп. ссылка 1)   Автор: Abylay Ospan  [комментарии]
 
Краткая сводка по результатам тестирования: 
   сервер 4 CPU, 16GB RAM, время сборки: 04:35:30 стоимость: $1.15 
   сервер 16 CPU, 64GB RAM, время сборки: 01:12:02 стоимость: $1.21
   сервер 40 CPU, 160GB RAM, время сборки: 00:32:15 стоимость: $1.34

По результам видно, что разница в цене всего 15%, но при этом время сборки
уменьшается в 8-9 раз. Сборка проводилась в разное количество потоков (make -j X).

Лучший результат показал вариант 'количество CPU * 2'. Исходные тексты Android
были взяты из репозитория на http://www.android-x86.org/
Сборка проводилась командами: 

   . build/envsetup.sh && lunch android_x86_64-eng && make -j X 

ОС: Ubuntu 14.04.2 LTS, kernel 3.13.0-48-generic x86_64 CPU: Intel(R) Xeon(R)
CPU E5-2676 v3 @ 2.40GHz HDD: SSD 160GB
 
----* Как собрать в новом GCC старую C++-программу, использующую iostream.h   [комментарии]
 
В блоках #include следует заменить iostream.h и fstream.h на iostream и fstream
(убрать ".h"). В начало файлов нужно добавить "using namespace std;", а при
сборке в Makefile указать флаг "-fpermissive".
 
----* Внедрение точек останова gdb в исходный код (доп. ссылка 1)   Автор: glebiao  [комментарии]
  На github [[https://github.com/kmcallister/embedded-breakpoints опубликован]] способ внедрения в исходный код точек останова для gdb, не влияющий на нормальное выполнение программы в отсутствие отладчика. Способ основан на размещении адреса локальной переменной в секции (embed-breakpoints линкера).
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Создание модуля для iptables, изменяющего ID пакета (доп. ссылка 1)   Автор: xlise  [комментарии]
  Данная статья основывается на материале "Разработка Match-модуля для iptables своими руками" (http://www.linuxjournal.com/article/7184), но код работает на ядрах 2.6.20+.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как в программе на Си узнать от какого пользователя запущен активный экран   Автор: pavlinux  [комментарии]
  #include #include #include // strcmp #include
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как указать GCC выводить предупреждения для бессмысленных сравнений (доп. ссылка 1)   Автор: Kir Kolyshkin  [комментарии]
  При сборке ниже представленного некорректного кода, gcc не выдает никаких предупреждений даже с -Wall, при этом указатель он приводит к unsigned, поэтому результат сравнения всегда ложен.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Изменение номера inode файла в Linux   Автор: Victor Leschuk  [комментарии]
  Для некоторых специфических целей может понадобиться изменить номер inode у существующего файла, либо создать файл с заранее заданным номером. Штатными средствами сделать это - задача нетривиальная, однако с помощью модуля ядра это несложно.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как отлаживать сетевые скрипты с помощью netcat (доп. ссылка 1)   Автор: Вячеслав  [комментарии]
 
   mkdir tmp
   cd tmp
   mkfifo sock1 sock2
   nc -l -p 8000 < sock1 | tee sock2 &
   nc 10.245.134.32 23 < sock2 | tee sock1

Теперь вместо того, чтобы устанавливать соединение непосредственно с узлом 10.245.134.32:23, 
делаем telnet на localhost:8000 из другой консоли на хосте home и наблюдаем
проходящие данные внутри
tcp-сессии в консоли, где выполняли команды.

Для этой же цели подходит и утилита socat: 
   socat -v tcp4-l:8000 tcp4:yandex.ru:80
 
----* Отладка php скриптов на стороне сервера   Автор: Pavel Piatruk  [комментарии]
  Иногда пользовательские скрипты или зависают, или хотят соединиться с чем-то запрещенным в файрволе, или интерпретатор неожиданно вылетает, не передав заголовок Content-type, что приводит к ошибке 500. Для того, чтобы разобраться в причине, попробуем отладить скрипты со стороны сервера, не залезая в код php. Сначала придется изменить конфигурацию apache, чтобы php работало через suphp, а не через модуль mod_php5. Я не буду рассказывать, как это делается. Главное, кроме обычного,
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Ускорение компиляции в Gentoo (доп. ссылка 1)   Автор: wildarcher7  [комментарии]
  В наличии два ПК, на которых установлен Gentoo Linux с одинаковой версией gcc (4.3.1). Так как компиляция из исходников в Gentoo необходима и компиляция отнимает некоторое время, хотелось бы сократить время сборки. На помощь приходит distcc и ccache.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* VMWare Workstation 6 для отладки ядра Linux (доп. ссылка 1)   Автор: Тарасенко Николай  [комментарии]
  Недавно была добавлена интересная особенность в Workstation 6.0, которая делает WS6 отличным средством для отладки ядра Linux. Теперь можно с легкостью отлаживать Linux VM на хосте при помощи gdb без каких-либо изменений в Guest VM. Ни каких kdb, перекомпиляций или еще одной машины не требуется. Все что вам потребуется, так это всего одна строчка в VM'шном конфигурационном файле.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как посмотреть причину генерации core файла в gdb (доп. ссылка 1)   [комментарии]
  программа - файл рухнувшей программы, собранной с включением отладочной информации core - файл с core
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как избавиться от линковки GNOME приложения с лишними библиотеками (доп. ссылка 1)   [комментарии]
 
Собираем по умолчанию:
    readelf -d /usr/local/bin/gnome-terminal |grep NEEDED | wc -l
    52 - требуется 52 библиотеки.

Устанавливаем флаг --as-needed:
    export CFLAGS = "-Os -s -Wl,--as-needed"

После пересборки, требуется 21 реально необходимая для работы библиотека.
 
----* Обобщение используемых моделей ввода/вывода (доп. ссылка 1)   [обсудить]
 
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Как посмотреть какие файлы пытается открыть или выполнить программа   [комментарии]
 
strace -f -o strace.txt -e execve программа
strace -f -o strace.txt -e open,ioctl программа
 
----* Как посмотреть какие функции системных библиотек используются в программе   [комментарии]
 
nm "объектный или запускной файл"
Для работы nm нужна таблица символов, т.е. нельзя использовать после утилиты
strip или ключа "-s" в gcc.
 
----* Как пропатчить приложение запускаемое через inetd для определения IP клиента.   Автор: uldus  [обсудить]
 
Си:
   struct sockaddr_in addr_name;
   socklen_t addr_len;
   addr_len = sizeof(addr_name);
   bzero(&addr_name, sizeof(addr_name));
   if (getpeername(0, (struct sockaddr *)&addr_name, &addr_len) >= 0){                          
     // выводим адрес в printf через inet_ntoa(addr_name.sin_addr)
   } 

Perl:
   use Socket;
   my $std_sockaddr = getpeername(STDIN);
   my $cur_ipaddr = "0.0.0.0";
   if (defined $std_sockaddr){
      my ($tmp_port, $tmp_iaddr) = sockaddr_in($std_sockaddr);
      $cur_ipaddr = inet_ntoa($tmp_iaddr);
   }
 
----* Какие параметры указать GCC для оптимизации. (доп. ссылка 1)   [комментарии]
 
-O6 - полная оптимизация (по умолчанию часто стоит -O2).
-fomit-frame-pointer -использовать стек для доступа к переменным.
-march=i686 -mcpu=i686 -DARCH=k6 -DCPU=k6 - оптимизация под CPU (586, 686,k5,k6,k7,athlon,pentiumpro).
-ffast-math -funroll-loops
 
----* Как узнать какие динамические библиотеки прилинкованы к программе   [комментарии]
 
ldd файл
 
----* Сборка хелловорлда под 17 платформ одним скриптом   Автор: Урри  [комментарии]
  Понадобилось настроить и запустить на сторонней машине автоматизированную сборку (и автотесты) своего кода сразу под ARM, MIPS, x86 и PowerPC - решил заодно поделиться с местным сообществом.
...
[Слишком большой объем текста. Скрыт. Для просмотра см. продолжение
]
 
----* Компиляция приложений с поддержкой OpenCL без закрытых драйверов   Автор: Аноним  [комментарии]
 
При сборке Wine не для личного использования, а чтобы распространять сборки, я
столкнулся с проблемой. С какой реализацией OpenCL линковать? NVIDIA, AMD,
Intel, Mesa? Ответ - FreeOCL!

На самом деле, не важно с чем линковать. У всех известных мне реализаций
OpenCL, сама библиотека libOpenCL.so.1 занимает  около 30 Кб.
Оказывается, внутри этой библиотеки ничего нет. Сам OpenCL находится в другой
библиотеке (например в libatiocl64.so - см.
/etc/OpenCL/vendors/*.icd для подробностей). Однако залить
проприетарный драйвер в OBS-репозиторий я не могу, так как закрытый код.
Остаётся только Mesa и FreeOCL.

FreeOCL это программная реализация OpenCL, написанная на C++, и имеющая у
себя в зависимостях libatomic_ops - а LLVM не имеющая. Установив в систему
FreeOCL и opencl-headers, я успешно собрал Wine. Причём
Wine линкуется только с OPENCL_1.0, что не помешало конечному софту,
запущенному в Wine, успешно задействовать расширения 1.2 и 2.0.

В общем, рекомендую всем, кто до сих пор собирает с AMD APP SDK 3.0, перейти на
FreeOCL. Я попробовал скомпилировать весь известный мне OpenCL-софт при помощи
FreeOCL, а затем запустить на NVIDIA и AMD - всё работает безупречно. Не
падает, не отказывается стартовать, и демонстрирует ровно ту же скорость работы.

P.S. Бинарник получает зависимость от libOpenCL.so.1 (параметр
-lOpenCL), а пакет RPM или DEB также получает от pkg-config ещё
несколько зависимостей:

   libOpenCL.so.1(OPENCL_1.0)(64bit)
   libOpenCL.so.1(OPENCL_1.1)(64bit)
   libOpenCL.so.1(OPENCL_1.2)(64bit)
   libOpenCL.so.1(OPENCL_2.0)(64bit)

Поэтому если вы собираете пакеты, а не просто tar.gz архив с программой,
рекомендую пропатчить FreeOCL патчем
freeocl-0.3.6-disable-symbol-versioning.patch. В этом случае, пакет получит
зависимость только от libOpenCL.so.1()(64bit). Например в моей
системе в пакете NVIDIA 340.xx нет "версионинга" OpenCL, а в 390.xx
он есть. Вследствие чего, пакет не хотел устанавливаться, но после force
install - работал.
 

 Версия для печати





Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру