2009-11-26[木] 〔D言語〕Ddbgの再コンパイルDdbg(Descent,CB)を使って変数表示がおかしくなるのは、 どうも Ddbgコマンドの lsv が使われた時みたい... なので、そこそこ状況限定されるから、なんとなくバグとれそうな 気がしてしまったで、 ソースのsvnリポジトリr1094 をみると実は公開exe(v.0.11.3)よりも新しいv0.12(2008-3-26)のソースがコミットされているようなのでした。 (コミットログにはbasic hardware breakpoint support-minor changesと) で、とりあえず Ddbg をコンパイルしてみたのですが... そこはD言語、やっぱり泥沼にはまったのでした。 Ddbg 自体はD1で作られていて、 最新のD1でコンパイルしても今まで見過ごされていたバグが 検出される程度(すぐ修正可能)だったのですが、 問題は、bud とパーサージェネレートに使われてる Apaged.
budはエラーがでるため、apagedは配布サイトにソースしかないため、
ツール自体の再コンパイルを行ったのですが、まさにドツボ。 結局、budについては、ソース構成割り出してバッチで処理, apagedに関してはふと apaged.exe を検索したらこちらで見つかったので それを用いることでなんとか. ただ apaged 自体の文法に変更があったり、 ジェネレートされたルーチンの関数引数が変わってるため Ddbg側もそれに合わせて必要だったり、と結構疲れました. あと win32 bindingも、今のdmdだと依存関係でひっかかり、ちょっと嫌な修正. udis86-1.4部分もたいしたことないけど (こいつも perl でソースジェネレートとかあって、それをさけるため) makefile若干弄ったりとか.
で、肝心の Ddbg lsv のバグですが、
StackSymbol[] locals_args = scope_sym.symbols.stack_symbols; auto psym = cast(ProcedureSymbol)scope_sym; if ( psym !is null ) locals_args ~= psym.arguments.stack_symbols; foreach ( sym; locals_args.sort ) {
の部分で、関数内ローカル変数一覧に関数引数変数を追加して
ソートし出力してるのですが、locals_args がコピーでなく実体
を指しているため、追加&ソートにより scope_sym.symbols.stack_symbols が
破壊されてしまっていたようです. とりあえず .dup つけて StackSymbol[] locals_args = scope_sym.symbols.stack_symbols.dup;
で直るよう.
弄った Ddbg をさらしておきます. [download]
ついでにbudのバグもメモ.
文字列インポートとしての import("file.txt") に未対応のよう. source.d の void doImport (in string pFileText, inout int pPos) 中の
bool first = true; //@@@ while ((lSavedPos = pPos, lCurrentToken = GetNextToken (pFileText, pPos)) !is null && (lCurrentToken != ";")) { if ( lCurrentToken == "(" && first) return; //@@@ first = false; //@@@ if ( lCurrentToken == ",")
のwhile付近に //@@@ の処理を追加すればとりあえずなんとかなるぽい. (自分のコンパイルしたexeを使って出るエラーの原因が不明なんでexe無)
と書いててて思い出した.
dmd自体の仕様変更かバグかしらないけど、
ddbg の再コンパイルではまった件として、-Jsrc 状態で import("cli\ddbg_help.txt") が使われてもソース無いって起こられてた. |