.debug_macinfoセクションですが、gccでふつーにコンパイルしても「出ません」
このセクション情報が、どーしても欲しい方、コンパイル時にちゃんとgccに注文してあげなきゃいけないです。
注文方法は
gcc -o <実行ファイル名> -g3 <ソースファイル名>で、”-g3”を注文する必要があります!
これは、一言です。「(C言語の)マクロ(プリプロセッサ命令)の情報」が入っています。
もちっと、具体的には、以下のものが入ってるみたいです。
逆に、「#pragma XXXX」は入っていないっぽいです。。。(あんま、デバッガには関係ないと思うけど、OpenMPって#pragmaの嵐じゃなかったっけ。。。)
ということで、以下具体的に見て行きますかね。。。
これ、おもしろいです。(というか、簡単?っぽいです)
他の.debug_xxxxxなセクションには付き物だった、<ヘッダ>はなく、ただひたすら、マクロ命令を表したレコード(原文中では、"macinfo entry")が埋まってるだけみたいです。。。
"macinfo entry"の基本的な構造は、以下みたいです。
で、マクロの種類によって、<Type Code>とそれにふっつく<引数x>は変わってきます。ということで、全6種類を以下表で整理してみました。
No. | Type Code名 | Type Code(1Byte値) | 引数1 | 引数2 | 概要 |
1 | DW_MACINFO_define | 0x01 | uLEB128 マクロ定義のソース行番号 | NULL終りの文字列 マクロ定義文字列(そのまま) | どんな#defineのマクロがソースのどこに定義されているか、です。 |
2 | DW_MACINFO_undef | 0x02 | uLEB128 マクロ定義のソース行番号 | NULL終りの文字列 マクロ定義文字列(そのまま) | どんな#undefのマクロがソースのどこに定義されているか、です。 |
3 | DW_MACINFO_start_file | 0x03 | uLEB128 #includeがあるソース側のソース行番号 | uLEB128 .debug_line上のファイルテーブルのソースファイルID | #include命令のソース上での開始箇所とどのファイルをインクルードするか、です |
4 | DW_MACINFO_end_file | 0x04 | - | - | #include命令によるインクルードの終了箇所を示すマーク、です |
5 | DW_MACINFO_vendor_ext | 0x05 | uLEB128 固定値 | NULL終りの文字列 | (コンパイラ)ベンダによる勝手?な拡張マクロ。 原文には、「このTypeCodeはコンシュマーは理解できないので全て無視せよ」と明記されていますんで、無視してやりましょー |
6 | (macinfo 終了コード) | 0x00 | - | - | この命令が来たら、macinfoのデータは終りです。 |
なお、TypeCodeは、それぞれ結構「癖」があるようです。(原文見る限り)
と、いうことで、以下でTypeCode別に、考慮事項をつらつらメモっときます。
これは、例えばソースの3行目に
#define CONST_VAL 3と書いてあった場合、
となります。
なお、以下は注意しておかなきゃならんことです。
これは、例えばソースの6行目に
#undef CONST_VALと書いてあった場合、
となります。
特段、注意事項とか、ありませんです。
この命令は、"#include"がソース上の何行目にあり、その"#include"で取り込まれるファイルは、どのファイルか、を教えてくれるものです。
よって、引数1は、"#include"のあるソース上の行番号です。これは簡単です。
で、問題は「引数2」です。上記 表内では引数2の欄に「.debug_line上のファイルテーブルのソースファイルID」と書きました。これ、何でしょう?ということで.debug_lineセクションの構造と読み方を見てみてくださいです。
ここには、".debug_line"セクションのヘッダ情報をまとめていますが、このヘッダ内の最後の項目に"file_names"なる項目があります。んで、この項目には対象とするCソースで使う、インクルードする.c/.hの一覧が埋まってます。
ということで、この「引数2」に入る数字は、なんとこの".debug_line"セクションのヘッダ内の"file_names"のレコード番号を入れる形で、インクルードするファイルを指定しています。
で、このDW_MACINFO_start_fileには、ちっとだけ注意事項が原文に明記されているので、以下列挙です。
このめーれいは、"DW_MACINFO_start_file"に相対するもので、#includeの終りを告げるマークです
これは、例えばsample.hなヘッダファイルをincludeする場合、このヘッダファイル内で#defineとかされていること、ありますよね。
sample.h内の#defineもDW_MACINFO_defineで出力されますんで、どこまでの出力がincludeされたヘッダファイル内での出来事なのか、を分かる必要があります。
ので、インクルードファイル内での出来事、終ったよんって教える時、この命令がポンと出て来ます。後で、例は出しますね。
あ、あと、このMACINFOは、ソースの1行目からマクロが登場した順に出力されていきます。これ御見知りおきを。
最後に、以下2点はちょっと気を掛けておかなきゃならんみたいです。
ということで、あんま注意になってないよーな気がしますが、とりあえず書いておきます。
[PageInfo]
LastUpdate: 2013-05-28 22:15:07, ModifiedBy: koinec
[License]
FreeBSD Documentation License
[Permissions]
view:all, edit:members, delete/config:members