Hatena::ブログ(Diary)

はてなるせだいあり このページをアンテナに追加 RSSフィード

2014年04月16日(水)

Cの構造体や関数が定義された位置を表示するnadokabot、crubybotつくった 18:31 Cの構造体や関数が定義された位置を表示するnadoka用bot、crubybotつくったを含むブックマーク Cの構造体や関数が定義された位置を表示するnadoka用bot、crubybotつくったのブックマークコメント

なにをつくったか

表題のとおり crubybot.nb ですが、その名の通りCRubyのソースを解釈して、与えた構造体や関数の定義位置を返します。返す時はGitHubURLなんですが、まぁそこは枝葉ですな。

libclang

Cコンパイラにはプリプロセッサ構文解析構文木の構築などが含まれています。ですので、Cソースで何かをしたい場合、Cコンパイラモジュールを使えると便利です。clang由来の便利なやつがlibclangです。

なにをしているか

find_def のあたりを見ればわかるでしょ。

まとめ

というわけで、libclangを使うと簡単にCソースで遊べるので便利です。

付録

きつねさんとおぼえる!Clang おかわり を読んだらもっと楽にできた気もするけれど、わたしは読めていません。

トラックバック - http://d.hatena.ne.jp/nurse/20140416

2014年03月17日(月)

最近のFreeBSDのsignal trampolineの場所 03:58 最近のFreeBSDのsignal trampolineの場所を含むブックマーク 最近のFreeBSDのsignal trampolineの場所のブックマークコメント

しばらく悩んでしまったので、後世の人が悩まないように。

プロセスにシグナルが送られると、カーネルはsignal frameをスタック(またはsigaltstack)に積み、「signal handlerを呼び、戻ってきたら後片付けをして元々のプログラムの位置に戻る関数(=sigreturn)を呼ぶコード」を実行します。詳しくは「インタプリタとシグナル - 微酔半壊」で。

で、このコードが signal trampoline なわけですが、backtrace で得られるアドレスにもこの signal trampoline 内を指すアドレスがあります。具体的には signal handler を呼んだ直後のアドレスです(理由はDEBUG HACKSのHACK #27あたりで)。なので、FreeBSD amd64 の場合 sys/amd64/amd64/sigtramp.S がどこに置かれたか探すわけですが、sys/kern/kern_exec.c だけを見ていると実際の値といまいちずれることがあります。

理由は r217151 にて shared page なるものが導入されたからです。酷いのは、実際に確保される場所が場合によって違うっぽいことで……、http://lists.freebsd.org/pipermail/freebsd-current/2013-November/046773.html:title=ある報告では0x00007ffffffff003だと言っているけれど」、手元では0x00007ffffffff193なんですよね……。

この問題は、r258661で実際に signal trampoline が置かれた場所を sysctl で取れるようになるようなので、それを待てば良いということになります。work around が必要ならば、shared pageの始まる0x00007ffffffff000以降のどこか、ということになりますが、まぁいいよね。

トラックバック - http://d.hatena.ne.jp/nurse/20140317

2014年03月07日(金)

C backtrace 22:04 C backtraceを含むブックマーク C backtraceのブックマークコメント

5. Backtrace系ライブラリについて。

> シグナルトランポリンとかよくわからないので教えてほしい。

わたしは黒のBSD本 (4.7 Signals) で勉強しました。日本語訳は入手困難だけど、英語版ならKindleで買えます。

が、第2版が8月にでるそうです!(3月14日追記)

> CRubyにもどっかから持ってきたのかaddr2line.cってやつがあって、さっきのexecinfo.hで得た情報をもとにして、更にDWARFのデバッグ情報をつかって情報を拾い集めている。

経緯は %ruby観察日記 2010-11-25#4089 にありますが shinh さんによる独自実装ですね。

なお、Rubyの場合、rb_print_backtrace() という C API が(非公開APIとして)存在します。

ので、デバッグ用ではご自由にお使いください。

公開するgemでは使うなよ!ゼッタイだぞ!!

トラックバック - http://d.hatena.ne.jp/nurse/20140307

2014年02月12日(水)

さくらのBASE Storage について 15:18 さくらのBASE Storage についてを含むブックマーク さくらのBASE Storage についてのブックマークコメント

待望のs3っぽいやつがさくらに来たので、chkbuildのログ上げてみたら、CentOS系だけで70GB近くあった。 http://logfiles.b.storage.sakura.ad.jp/

content-typeとHTTPヘッダ (Content-Encoding) の設定ができないので、html.gzやtxt.gzをブラウザに自動展開してもらえないのが困っている。

トラックバック - http://d.hatena.ne.jp/nurse/20140212

2014年01月17日(金)

GitHub で Web だけで Pull Request を投げるには 17:08 GitHub で Web だけで Pull Request を投げるにはを含むブックマーク GitHub で Web だけで Pull Request を投げるにはのブックマークコメント

あらすじ

  1. typo の修正とかでいちいちローカルにリポジトリ取ってくるのだるいよね。
  2. GitHub って Web でファイル編集できて便利だね。
  3. 油断してると master で編集しちゃうけど、master ブランチから Pull Request とか小学生でも許されないよね
  4. どうやってブランチを作ればいいんだろう?

A: ブランチ選択画面から作れます

まとめ

結論としては、以下の様な手順になります。

  1. fork する
  2. ブランチ選択画面で、修正の元となるブランチに移動する
  3. 再びブランチ選択画面で、入力欄におもむろに新しいブランチ名を入れて Enter おす
  4. 新しいブランチができるので、Web から編集してコミット
  5. Pull Request 投げる

まとめ2

ヘルプがあったらしい

トラックバック - http://d.hatena.ne.jp/nurse/20140117