Hatred's Log Place

DON'T PANIC!

Dec 13, 2011 - 2 minute read - Comments - programming

MinGW: кросс-отладка win32 приложений в Linux

По сути парочка дополнений для этой статьи: http://mingw-cross.sourceforge.net/cross_debug.html

Задача: есть win32 приложение, собранное путём кросс-компиляции при помощи cmake и mingw32, нужно запустить его в отладчике и поймать на чём оно падает.

Необходимый инстументарий: 1. установленный mingw32 2. wine (winconsole) 3. бинарная версия gdb для windows, брать тут:

http://sourceforge.net/projects/mingw/files/MinGW/Extension/gdb/ 4. версия gdb, собранная для Linux, знающая как подгружать win32 приложения, собранные mingw. Тут нужно искать сборку для вашего дистрибутива, для пользователей ArchLinux я сделал PKGBUILD и поместил его в AUR:

https://aur.archlinux.org/packages.php?ID=54802

продвинутые пользователи могут подглядывать в мои правила сборки и собирать самостоятельно :)

Бинарную версию нужно будет распаковать, например в ~/bin/mingw32-gdb-win32/. В директорию ~/bin/mingw32-gdb-win32/bin/ при этом следует сделать следующие симлинки:

cd ~/bin/mingw32-gdb-win32/bin/
ln -s /usr/i486-mingw32/bin/libexpat-1.dll .
ln -s /usr/i486-mingw32/bin/libiconv-2.dll .
ln -s /usr/i486-mingw32/bin/libintl-8.dll .

Всё. Впринципе всё готово для отладки.

  1. Запускаем сервер:bash wineconsole cmd /K ~/bin/mingw32-gdb-win32/bin/gdbserver.exe localhost:6000 test-app.exe [аргументы для программы с которыми она должна запускаться]
  2. Запускаем клиент gdb:bash i486-mingw32-gdb test-app.exe
  3. В запущенной версии gdb выполняем следующую команду:gdb (gdb) target remote localhost:6000

Ну и по сути всё, дальше делаем всё как при обычной отладке при помощи gdb, устанавливаем точки останова, смотрим данные, делаем бектрейсы и т.д. Единственная разница, что для запуска приложения нужно использовать не команду run, а команду continue, но собственно если забудете или перепутаете - отладчик вам подскажет.

Если программа что-то выбрасывает на консоль, вы увидете это в окне wineconsole.

Если захочется графической отладки, смотреть в сторону ddd и ссылку, что я давал в начале поста.

Dec 13, 2011 - 1 minute read - Comments - programming c++

inet_aton для windows

Если коротко: функиця заполняет структуру типа in_addr, преобразуя сведения о хосте из строкового представления.

У winsock2 нет такой функции. Есть более продвинутый аналог inet_pton, в POSIX он тоже есть, да вот только mingw про неё в windows не знает. Пичалька.

Поэтому делаем примерно следующее:

#ifdef WIN32
static int inet_aton(const char *cp, struct in_addr *inp)
{
    if (cp == 0 || inp == 0)
    {
        return -1;
    }
    
    unsigned long addr = inet_addr(cp);
    if (addr == INADDR_NONE || addr == INADDR_ANY)
    {
        return -1;
    }
    
    inp->s_addr = addr;
}
#endif

не верх совершенства и корректности, но для моих целей работало.

Dec 13, 2011 - 1 minute read - Comments - programming c++

winsock2: неблокирующийся сокет

    unsigned long arg = 1;
    ioctlsocket(sockfd, FIONBIO, &arg);

в Linux:

    int arg = fcntl(sockfd, F_GETFL, NULL);
    arg |= O_NONBLOCK;
    fcntl(sockfd, F_SETFL, arg);

или универсальная функция:

void setSockNonblock(int sockfd)
{
#ifdef WIN32
    unsigned long arg = 1;
    ioctlsocket(sockfd, FIONBIO, &arg);
#else
    int arg = fcntl(sockfd, F_GETFL, NULL);
    arg |= O_NONBLOCK;
    fcntl(sockfd, F_SETFL, arg);
#endif
}

Dec 13, 2011 - 1 minute read - Comments - programming c++

Альтернативная сборка MinGW

Занимаясь разработкой небольшой программы, использующей сокеты, потоки и не использующей фреймворков, типа Qt, столкнулся с необходимостью собрать это дело для Windows. Подводных камней оказалось много, как результат познакомился с такими милыми сущностями, как Boost.Thread и Boost.Asio.

Но тут вспомнилось, как мне уже приходилось собирать под Windows окружение, для компиляции исходников, использующих Boost и стало грустно. Грустно настолько, что оказалось проще сделать бинарники путём кросс-компиляции. И вот, когда дело было сделано, натыкаюсь на этот ресурс:

http://nuwen.net/mingw.html

Стефан (автор этого поделия) предоставляет сборку MinGW включающую сам компилятор, набор полезных библиотек (включая Boost 1.47.0!) и некоторых полезных утилит. Пакет не требует установки, просто распаковываем в c:
mingw и пользуемся.

Так что на будущее, буду пробовать.

Dec 13, 2011 - 1 minute read - Comments - programming c++

Таймеры в Windows

Внезапно, правда? :)

Но волей судеб нужно было портировать программку, в которой использовался nanosleep(2). И…

Для внезапно стало откровением: В WINDOWS НЕТ ТАЙМЕРОВ ВЫСОКОГО РАЗРЕШЕНИЯ. А есть только по сути хаки и вызов Sleep, с минимальным промежутком в 10мс.

Наиболее часто рекомендуемый вариант:

void sleep_nsec(int64_t interval)
{
    int64_t time1 = 0, time2 = 0, sysFreq = 0;

    QueryPerformanceCounter((LARGE_INTEGER *) &time1);
    QueryPerformanceFrequency((LARGE_INTEGER *) &sysFreq);

    do
    {
        QueryPerformanceCounter((LARGE_INTEGER *) &time2);
    } while(((time2-time1)*1000.0*1000.0/(double)(sysFreq)) < interval);
}

Но тут мы упираем процессор в полку. Есть вариант с использованием select, но, по отзывам, он так же может ждать не менее 10мс.

Т.е., по сути, это единственный вариант для Windows, да ещё и не лишённый глюков: почти все процессоры уже умеют автоматическое понижение частоты… Чуете? Пока работает цикл, значение sysFreq может измениться (поправьте меня, если я не прав) и время потекло.

Кроме того, наткнулся на статью:

http://www.codeproject.com/KB/system/timers_intro.aspx - Timers Tutorial

Описываются различные вариант таймеров: стандартные win32, мультимедийные, Waitable Timers (не знаю как лучше перевести на русский язык), Queue Timers. Но опять таки, все периоды - миллисекунды.

Dec 12, 2011 - 1 minute read - Comments - programming

Qt Creator & doxygen

Сегодня пролетело в рассылке: > Hi, > > Qt Creator master has recently got a feature, which has been requested a > few times, for Doxygen blocks generation. If you type /** or /*! and > press enter/return before a declaration, you’ll get something like: > cpp-qt /*! * * <br/>param data * <br/>param options * <br/>return */ QString generate(const Data &data, const Options &options); > You can also opt whether or not you want an additional <br/>brief command > and leading asterisks for comment continuation (when breaking lines). > The options are in Text Editor->Completion->Documentation Comments. > > Notice that the style is identified from the comment beginning. If you > start it with /*! then the Qt style is used. Otherwise, the Java style > with the @ prefix for the commands is picked. > > Cheers, > Leandro

Проверил - работает, удобно :)

Dec 1, 2011 - 1 minute read - Comments - programming

Hibernate + SQLite

Шаг 1. Взять sqlite-jdbc отсюда: http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC или при помощи Maven (описание по той же ссылке)

Шаг 2. Положить у себя в проект класс SQLiteDialect, взятый отсюда: http://arnoraps.tweakblogs.net/blog/3146/hibernate-with-sqlite.html или из архива отсюда: http://code.google.com/p/hibernate-sqlite/ (HibernateSQLite.zip)

Шаг 3. В конфигурацию Hibernate добавить примерно следующее: ```xml org.sqlite.JDBC jdbc:sqlite:./data.db ru.sincore.db.SQLiteDialect

```

Nov 17, 2011 - 4 minute read - Comments - programming

Jetty, JSP и Maven

На правах заметки: * Список зависимостей для Maven, что бы получить последнюю (8.0.4) версию embedded Jetty и получить рабочий JSP. * Конфиг для embedded Jetty, что бы завёлся JSP.

Подробности подкатом

Nov 16, 2011 - 1 minute read - Comments -

Java Timezone

В последней Java6 не включена tzdata с информацией о том, что в России, сейчас нет перехода на зимнее время. Дальнейшие пояснения излишни.

Как фиксить? Обновить tzdata при помощи предлагаемой ораклом утилиты: * Timezone Updater Tool * Java SE TZUpdater Downloads - что бы скачать, не лазя по дебрям, или прямая ссылка: http://download.oracle.com/otn-pub/java/tzupdater/1.3.42/tzupdater-1_3_42-2011k.zip

Nov 10, 2011 - 1 minute read - Comments -

Новый GTK+ и падение Opera

После очередного обновления, заметил, что Опера перестала стартовать. При запуске из терминала, вываливает следующее:

$ opera

(opera:13093): Gtk-CRITICAL **: IA__gtk_widget_unrealize: assertion `GTK_IS_WIDGET (widget)' failed

(opera:13093): Gtk-CRITICAL **: IA__gtk_widget_is_toplevel: assertion `GTK_IS_WIDGET (widget)' failed
opera [crash logging]: CRASH!!
/usr/lib/opera/opera got signal SIGSEGV at address B6B26E77

Log was created here:
/var/tmp/crash20111110210615.txt
Убито

Для столкнувшихся с этой же проблемой в ArchLinux: * и раз: https://bbs.archlinux.org/viewtopic.php?pid=1006655 * и два (Opera 11.60): https://aur.archlinux.org/packages.php?ID=53816 * и три (Opera Next 12.00): https://aur.archlinux.org/packages.php?ID=48680

Nov 2, 2011 - 1 minute read - Comments -

Переехал на BlogTNG

Переехал на BlogTNG вместо классической связки плагинов blog/tag/discussion. Разработчики, к слову, те же самые.

Уже пришлось малость залезть в исходники, для корректировки работы с тегами, но в целом ощущения положительные.

Теперь будем постепенно адаптировать другие части системы под новый блого-движок.

Oct 31, 2011 - 1 minute read - Comments -

Библиотека

Как сказал один умный дядька (вот к своему позору запамятовал как его зовут, вроде Аристотель): “Дайте мне библиотеку и я в пустыне построю университет!”. Пусть у меня тут не университет, но… полезных и интересных книг? есть их у меня! Посему начинаю проект по публикации своей домашней электронной библиотеки. И вот первые ласточки: материалы по учебе в ДВГТУ

Oct 31, 2011 - 1 minute read - Comments - life

Пять процентов

Подкинули ссылочку на интересную статью в компьютерее, называется “Пять процентов”

Интересная нужно сказать теория. Тут вот думаю, к каким “пяти процентам” отношусь я?