観察日記 2010-11-25

今日は「Ruby 1.8.7 の新パッチリリースが12月25日公開予定」や「blade復活」、「JIS Ruby 意見受付公告」と、トピックの多い一日でした。

SEGV 時の C level backtrace

C level backtrace全部出るようにしませんか
全部というと
行数もほしいある
そりゃポータブルには取れない
パッチあったら突っ込んでいいですよ
途中抜けてるのはなに?
おれもほしいから。
なるほろ
Mac死ねってことにしてELFだけなんとかすればwin32系はそのうちうささんが何とかする気もちょっと
途中抜けてるのは最適化された関係で関数がインライン展開されたとかがありうる。
gdbが取ってるんだからo-machも取れば取れるんだろうな。
あと変なオブジェクト形式というとAS/400
gdbは単にaddr2line(1)からひっぱてきてるのではないか疑惑
man> addr2line
{util_mput} addr2line http://tinyurl.com/2w4kxt6
http://0xcc.net/blog/archives/000073.html ふむ
{util_mput} 普通のやつらの下を行け: BFDでデバッグ情報の取得 - bkブロ... http://tinyurl.com/2fjxeml
win32はすでになんかできてたような、行数は無理だっけ
http://reality.sgiweb.org/davea/dwarflicense.html libdwarfがLGPLらしいのでこれがあるならlinkするとかいう選択肢はあるかもしれない。
{util_mput} DA's DWARF Page http://tinyurl.com/22u4eva
SEGVしたらデバッガを走らせるとか
デバッガが存在するという仮定はおかしい。
もちろんあるときだけで
我々はなぜSEGVのバックトレース情報を充実させようとしているのか?
日常的に必要だから
普段からデバッガがある環境で生きてる人間なら普段からgdb --argsで生きればいい
そうじゃないでしょう
redmineに報告されてくる情報を多くしたいからじゃないの
つまり想定ユーザーは俺らじゃない。
gdbのaddr2lineはaddr2line(1)より効率的にやってたと思いますどうでもいいですが
じゃ常に最適化禁止で
最適化されてたらredmineに報告しろっていう最後のを出さないようにするのはありかもとちょっと思う
debianだったら-dbg入れろって言うとか
gccなら定数見たら最適化かかってるか分かる
__OPTIMIZE__だっけ
ほう
http://msdn.microsoft.com/en-us/library/b0084kay%28VS.80%29.aspx を見ると
VCにはなさげ
マクロ以外で調べれるのかもしらんけどね
Makefile.subかconfigureでoptflagsを調べりゃ
とも限らない。
gccには__attribute__((optimize(...)))という凶悪な機能があるので
別に完璧を求めなくてもいいんじゃね
ま、gccなら定数見るのが簡単かつ完璧なんじゃないですか。
ついでに最適化を切るとか
最適化されてるかどうか知るのに比べて最適化切るのはさらに輪をかけて難しそう
デフォルトを-O3から-O0に変えるだけ
glibc の backtrace に比べ、addr2line のほうがリッチな出力を出したと思う
で、gdb のほうがもっとリッチ
gdbまで必要ないので
過不足なく情報が取れればOK
そういやgithubはまだ止まってんの
* 行数が知りたい
* static関数も見たい
の二点だけ満たされればいいよ
addr2line に突っ込めば、その点は満たされなかったっけ
libelfとlibdwarfでだいたいいけそうなきがするよ
libdwarf とか使わん方がラクくらいの勢いですけどね…
そうなんだ
結局状態機械回すとか自分でやる必要があったような
とりあえずドキュメントはなさそうというところまでは確認した。
PCは表引きできる?
PC->行番号
ELF 用の addr2line とかだけならこのへんに昔書いたのが https://github.com/shinh/test/blob/1f58c3c370e690595f3d2e0d12d4ed8e8aafab55/addr2line.cc
libdwarfってDWARF読むところまでだったと思うんで
読んでから解釈しなきゃならんかったと思うんですよね
なるほど
やっぱ gdb 呼ぶのが早いんじゃないか
正しいと思いますね
SEGV したら gdb attach させるとかで普通に便利
まあ開発者はそれで便利ですね
バグ報告にはてんで役に立たないけど。
gdb -p -ex 'bt' -ex 'p "Please send the above stacktrace"' とかなら…
--eval-command=COMMAND, -ex みたいな感じで

なんかこないだ話題になってた ELF 用に backtrace に行情報足すってやつ適当にやってみたんですが需要あるんですかね… http://shinh.skr.jp/t/ruby-addr2line.patch
とりあえずわたしがうれしい
なんかSEGVさせてみた
ちゃんと出てますかね全然テストしてないので動かなくても不思議はない感じですが
そしてびるどできない
FreeBSDじゃだめかしら
{nurse} ../../ruby/addr2line.c: In function 'fill_lines':
{nurse} ../../ruby/addr2line.c:365: error: 'Ehdr' undeclared (first use in this function)
{nurse} ../../ruby/addr2line.c:365: error: (Each undeclared identifier is reported only once
{nurse} ../../ruby/addr2line.c:365: error: for each function it appears in.)
{nurse} ../../ruby/addr2line.c:365: error: 'ehdr' undeclared (first use in this function)
{nurse} ../../ruby/addr2line.c:365: error: expected expression before ')' token
{nurse} ../../ruby/addr2line.c:366: error: 'Shdr' undeclared (first use in this function)
{nurse} ../../ruby/addr2line.c:366: error: 'shdr' undeclared (first use in this function)
{nurse} ../../ruby/addr2line.c:366: error: expected expression before ')' token
{nurse} ../../ruby/addr2line.c:368: error: 'shstr_shdr' undeclared (first use in this function)
{nurse} ../../ruby/addr2line.c:371: error: 'debug_line_shdr' undeclared (first use in this function)
あー ElfW が無いのか…
すいません自分で定義せにゃいかんですね
Elf32_Ehdrとかはいるっぽいな
ええ # if SIZEOF_VOIDP == 8
# define ElfW(x) Elf64##_##x
# else
# define ElfW(x) Elf32##_##x
# endif
あたりを足すといい気がします
なるほど
通った通った
FreeBSD だとたぶん dl_iterate_phdr 無いからうまくいくとしても共有オブジェクトとかの行出ないですね…
全く行数が出なかった
残念
zannnen
気を取り直してUbuntu
そもそも 32bit とかテストしてないなーとかいう感じで動く気がしないですね…
僕もいろんなとこで遊んでみます…
32bit環境はわたしもまともに持ってないので大丈夫です(ぉぃ
おー、でたでた
それはよかった
とりあえずさくらが FreeBSD なんでちょいと見てみます
よろしぅ
そもそもさくらの FreeBSD は execinfo.h が無くて backtrace すら出ないと判明…
portsからdevel/libexecinfoを入れるのです
なるほどさくらの環境で ports はきつそうだから今度自分で野良ビルドしてみますかね…
というか FreeBSD 入ってる qemu イメージの2つや3つはどっかにありそうだ
普通にportsいけたよぅ
あ、FreeBSDででない原因わかった、
backtrace_symbolsの出すsymsのフォーマットが想定と違う(ゎ
ちなみに、dl_iterate_phdrはある
でた!
っと思ったらminirubyでしかでないな
fill_linesにも仮定があった
fill_base_addr も同じようなことやってるのでご注意を…
ふむ、動くようになった、が
rubyからしか取れないので非常に嬉しくないな
(librubyからとれない)
fill_base_addr の方もなおされました?
直したつもりなんですが
じゃあなんかまだ別の問題があるんですね…
shared object がダメなのはそのへんがあやしい…

info->dlpi_nameに"libruby.so.19"しか入ってなかった
...
でた!
http://nalsh.jp/patches/addr2line.patch FreeBSDでも動くようにした

バグ報告のOSごと内訳

とりあえず報告の数十%はdebianな気がするので入れたい派
そのへんの比率は興味あるんですけど報告者数で見ると linux > win > mac な感じとかなんですか
それとも普通に win が多いのかな…
感覚的にそんな感じ
linuxがwinの倍で、macとwinが同じくらいじゃないかなぁ
なるほどやはり linux mac が世間の比に比べて多いわけですね
ruby -v欄で絞り込めた
linux474 darwin285 mswin182 mingw124
ちなみにbsd48
体感がだいたいあってる感じですね…
今のが1.9で、Ruby全体にするとlinux749 darwin425 mswin251 mingw183か
まぁ、傾向は同じ、linuxの差が開いてるかな