C#でも最後の砦はアセンブリコード
今VS2013ですが、昔からデバッガでは、アセンブリコードでもデバッグ出来ました。
「もちろん、C#でも!!」
「.pdb入手してMyCode以外もデバッグ出来るようにしたら、ランタイムやOSSのライブラリもデバッグ出来ますよ」
(2016/02/09追記)
NuGet Package開発者の皆さん!!.pdb配布お願いします。
シンボル用Package作らなくてもpackage/files/file/@srcで追加できますよ!!
C#オンリーだと記憶にないかもしれませんが、アンマネージデバッグも有効にしていると、シンボルが見つからない時に、呪文のようなコード出て慌てた経験はありませんか?
それがアセンブリコードです。
「ILじゃないですよ」
少し似てますが・・・
「アンマネージC++ではおなじみです」
- ブレークさせる
- Debugメニュー>Windows
- DissemblyとRegistorsを選択
で表示&デバッグ出来ます。
ILを見ても良いですが、マシンレベルではアセンブラに変換されて実行されるので、何か腑に落ちないことがあるときは、頼りになります。
「アセンブラに展開した時の各処理命令のCPUサイクル数を足し算すれば、実装方法によってパフォーマンスが違う理由も納得がいく」
「メソッドコールはコストがかかるって言うけど、レジスタをスタックに退避してから、コードを実行して、終わったらスタックからレジスタを復元するので、アセンブラを見たらあたりまえ」
「でも、最適化でインライン展開してくれるときもある」
「デバッグ版とリリース版は別のプログラムだから・・・」
まあ、非同期とか、システムコールとか、I/Oが挟まったら、そんなに簡単な話じゃありませんが・・・
「パイプライン使ってるので、一瞬実行順序がおかしいって思うこともあるから、レジスタの動きをちゃんと見よう」
「パイプラインぐらいは勉強しておいても損は無いから・・・」
https://msdn.microsoft.com/ja-jp/library/afzk3475.aspx
IntelのリファレンスPDFダウンロード
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
「いきなりリファレンスはちょっと・・・」
って言う人は、ググればいろいろ出てくるみたいですよ。
「ILも似てるから、先に勉強してもいいかも」
岩永大先生のサイトにも記事があります。 (2016/02/09追記)
さすがに、最近のコンパイラの最適化技術はすごいから、サラでコードを書く必要がある人は殆どいないですが、あなたもデバッガ見ながらニヤニヤしてみませんか?