2009/06/06

gcc-sjljでビルドしたバイナリのデバッグ

Mingw gccでは、DWARF-2(DW2)版とSJLJ版というものがあるらしい。検索したところ、それぞれの特徴は以下のようである。

W.Deeの2008年2月の日記:

[前略]それまでのMINGWでのC++例外はSjLj (Setjump/Longjump) 例外ハンドリングといって setjump/longjump を使って例外を実装している物で、try...catchがあるたび、あるいはスタック上にインスタンスをおいただけでもそこにsetjumpをするため、例外が発生もしないのに実行コストがかかる物でした。DWARF2はもともとデバッグ情報形式の一つですが、これを用いて例外のcatch先を探すのが DWARF2 Exception Handling (DW2 EH) ということになります。この方式は例外が発生しないかぎりは実行コストがかからないそうです。

TDM's GCC/mingw32 Builds (非公式Mingw gcc配布サイトの解説より):

As a general rule, you should choose the default SJLJ packages, unless you know you need faster exception handling and can guarantee you'll never need to unwind through non-DW2-compiled stack frames (such as a Windows callback).

DW2 unwinding is desirable for a number of reasons, but cannot yet (on Windows) pass exceptions through "foreign" stack frames (code compiled by another non-DW2-enabled compiler, such as OS DLLs in a Windows callback).

簡単に言えば、DW2の方が速いが、他者が開発したものとリンクさせる場合の扱いが難しい、ということのようだ。

蛇足になるが、"unwind"という単語を当初知らず、辞書で引いたが意味がさっぱり通じなかった。(例外発生時の)スタック巻き戻しをこう呼ぶらしく、スタックアンワインドという用語も一般的なようだ。Wikipediaの記事が参考になる。

 

本題に入る。MSYSでgccのver.4.xを使用しようとした場合、公式のsourceforgeサイトでは、現在、testing版としてgcc-4.3.0-alphaが、テクノロジプレビュー版としてgcc-4.2.1のソースとgcc-4.2.1-sjljが提供されている。

従って、公式ビルドであり、alpha版を避け、なおかつ容易に導入できるという条件をつけると、gcc-4.2.1-sjljのみが候補となる。

そのような理由でgcc-sjljを使い始めたが、gdbを用いたデバッグ時、設定したブレークポイントで正しく停止しないなどの不都合が見つかった。

解決方法は、ビルド時、-gや-ggdbオプションではなく、-gstabsあるいは-gstabs+オプションを用いることだった。

また、ffmpegのビルドオプションでは、--enable-debugで指定した文字列が-gオプションの後の文字列としてビルドされるので、例えば--enable-debug=stabs+とすることでgccに-gstabs+オプションが渡る。

参考:

| | コメント (0) | トラックバック (0)

2009/05/24

ニコニコ動画の色々なフィードに対応してみた - NicoBrowser(nico browser)

http://nicowiki.com/?RSSフィード一覧 にある通り、ニコニコ動画のフィードは複数存在している。従来は、このうちの一部のみを対象としていたが、今回、その他の対応も考えてみた。

NicoBrowser(2009/05/24版)をダウンロードする

設定ファイルが従来のものと互換性が無くなっているため、2009/03/23版以前から使用している場合、注意が必要となる(詳細はREADME参照)。履歴ファイル(nicodb)の互換性はあるため、設定ファイルを適切に記述すれば履歴は引き継げる。

想定している動作環境は、従来どおりJava5である。ただし、実行確認はWindowsXP及びXubuntu下でのJava6でのみ行っている。

新機能としては、冒頭に記載したものも含め

  • デイリーマイリストランキング以外のフィード対応
  • 一部のswfへのアクセス仕様が変更になったことへの追従(従来の版ではアクセス不可)
  • 出力ログの可視性向上

となる。ログについては、既に改善の余地がある箇所を見つけてしまったが、次回以降で対応しようと思う。

追記:フィードのURLを一覧にしてみた。カテゴリ別の毎時(hourly)ランキングに何も表示されていないのは仕様のようだ。

追記2:zipファイルの中に入れている一覧は、どうも内容が古かったようだ。上のリンクの方が新しい(現状に即した)ものになる。

| | コメント (4) | トラックバック (0)

2009/05/02

FAACがLGPLの下で再配布できないことが発覚したらしい

FAACは、サイトの記載にある通りLGPLとして配布されていたが、ソースコード中に、LGPLと矛盾するものが含まれていたそうだ(参考:[FFmpeg-devel] [RFC] Libfaac not LGPL?)。矛盾するライセンスとは、こちらのことのようだ。

これに伴って、ffmpegのビルド時、--enable-libfaacオプションを有効にするためには--enable-nonfreeオプションも必要になった。

--enable-nonfreeオプションでconfigureコマンドを実行すると、"License: unredistributable"というメッセージが表示される。つまり、このオプションをつけたffmpegバイナリは再配布できない。

このような場合でも、自分が著作権を持っているものであれば、例外条項を付与することで回避できるようだが…

| | コメント (0) | トラックバック (0)

2009/04/19

TortoiseHgのテーマを変更する

TortoiseHgのインストール時にテーマを選択できるが、デフォルトのテーマ(Neutrino)はWindowsXPに合わず、変更の方法を探した。

FAQに記載の通り、C:\Program Files\TortoiseHg\etc\gtk-2.0\gtkrcをテキストエディタ開き、現在のテーマをコメントアウトし、表示させたいテーマのコメントアウトを外せば反映される。

Blue-Steel, Brushedも合わず、結局MS-Windowsに落ち着くことになりそうだ。

…0.7.3インストール直後に0.7.4がリリースされた…

| | コメント (0) | トラックバック (0)

2009/04/16

MSYS MinGW gcc3.4.5でffmpegコンパイル

猫科研究所さんのサイトを参考にしながらffmpegをコンパイルしてみる。その1, その2からのつづき。

[MinGW+ffmpeg(7)ffmpegのビルド]を見ながら、本題であるffmpegコンパイルを行った際に引っかかった箇所を記述する。

まず、現在のconfigureの記述には、pthreadGC2の記述が含まれており、全く考慮されていないわけでは無さそうだった。どのように変更を加えればわからなかったのだが、とりあえずwsock32を追加した。

2004,2005c2004,2005
<     elif check_func pthread_create -lpthreadGC2; then
<         add_extralibs -lpthreadGC2
---
>     elif check_func pthread_create -lpthreadGC2 -lwsock32; then
>         add_extralibs -lpthreadGC2 -lwsock32

libx264の箇所は、記載されている通りに修正した。

次に、configureのオプションだが、--enable-liba52 と --enable-swscaleは無くなっている様だった。webを検索してみると、どうも現在ではデフォルトで有効になっているらしい。

3点目。これもconfigure実行時になるが、configureが正常終了しなかった。出力されたconfig.errファイルを見てみると、faad.h: No such file or directoryというエラーが出力されていた。そこで、環境変数C_INCLUDE_PATHC:\msys\1.0\mingw\includeを追加した。冒頭サイトの手順で進めて行った場合、このディレクトリには今までコンパイルしたライブラリのヘッダが格納されていることになる。

4点目。make実行時、make: *** No rule to make target `libpostproc/libpostproc.a', needed by `all'. Stop.というエラーが発生した。これは、makeのバージョンを上げることで対応できる。MSYSのCurrent ReleaseであるVersion1.0.10にあるmakeはVersion3.79であるが、MSYS1.0.113.81(make-3.81-MSYS-1.0.11-2.tar.bz2)に入れ替える。

5点目。make時にC:/msys/1.0/mingw/include/sched.h:152: error: syntax error before "pid"のエラー。pthreads-w32のヘッダの誤りということらしく、こちらのサイトにあるパッチ(Pthreads-w32-2-8-0.diff)を当てることで解消できる。

以上で、ffmpegはビルドできた。

 

問題点として、pthreadGC2について、前述のパッチを当てることでコンパイル済みのpthreadGC2をリンクすることができたが、パッチを当てると、ptheadGC2自体のコンパイルが行えない、というものがある。

どうも、現在において、ffmpegをビルドするにはこの環境は古いように思われる。MSYSやgccのバージョンを上げて(暇があれば)再度試してみようと思う。

最新のバージョンが欲しいと思った場合でも、Automated Unofficial FFmpeg Win32 Buildsでバイナリが手に入るので、自分でビルドする必要はあまり無いのかな、とも考えたりした。ここにあるstatic-howtoは、configureやmakeのオプション、必要なパッチなどが書かれているため、手動でビルドする際にも役立つかもしれない。

| | コメント (2) | トラックバック (0)

«Portable Ubuntu for Windowsでお手軽Linux環境を実現する