コマンドライン引数を与えてデバッグする

コラッツ木生成ツールとゼルコバの木が一体化し一つのアプリのように連動するようになった.これはとても重要な一歩だが,あちこちで不具合も見られる.ともかく,このような使い方をすることに決めた以上使えるようにしなくてはならない.一つづつ潰してゆくことにしよう.

まず,系統並び替えの入口で基準ノード番号が0になっているという点から見てゆくことにする.これは結局,基準ノード番号の初期値が未定ということを意味していると考えられる.

通常系図データファイルには基準番号が保存されているので,それを取り出せば済むことだが,インポートした場合にはどこでそれを決めたらよいのだろう?⇒CSVファイルをファイル→隣接リストのインポートで読み込んだ場合には問題なく動作している.つまり,コラッツ木検定から直接ゼルコバの木を起動した場合にだけ起きる不具合だ.ノーマルなインポート手順と比較してどこか抜けているのだろう.

コラッツ木検定からゼルコバの木を直接オープンする場合はコマンドラインで引数が渡される.このようなコマンドラインからの起動は,「ファイルオープンテスト」でも行われているが,特に問題は起きていないように思われる.MDIForm_Loadの出口でコマンドラインを処理していところで,OpenFileProc(, OPENMOD.FULLIMPORT)の戻り値をCurrefnumに格納するようにした.

小さいサンプルでは問題は起きていないが,高さ60くらいになるとスクロールバーと実際の図面が合わなくなる.しかし,ズームなどの操作で画面を更新した後は,問題なく描画できる.⇒ズームアウトで縮小表示すると正常描画されるが,拡大方向ではまだおかしな図形が出てくる.人名枠は表示されても名前が出なかったり,一部の枠線が描画されなかったり.クリッピングの問題である可能性は高いような気がする.「再描画」を実行しても変化しない.⇒ウィンドウサイズを変えると正常に戻る.何かもう一つアクションが足りていないように思われる.

おかしい.リリース版に戻したらまた「基準ノード不在」が出るようになった.ツールの動作にもおかしいところがある.アプリを開発環境から起動して,インポートを実行した後,アプリを終了しても開発環境に制御が戻ってこない.また,エクスポートパネルはTopMostで実行しているのに,アプリ終了できてしまうというのもおかしい.⇒メインフォームをTopMostにしていたためだ.しかし,修正してもアプリ終了で制御が戻らないという現象は変わらない.

エクスポートパネルをHideで閉じていたので,Closeに変更したが,変化しない.FormClosedイベントは処理されているのだが…FormClosedの中で明示的にEndを実行することで正常終了できた.

基準ノード不在はOpenFileProcを実行する前に発生している.しかも,その後,OpenFileProcは2度呼び出されている.最初はmode=0,つぎにmode=2で呼び出される.mode=0はOPENMOD.ORDINARYだ.どこから呼び出されているのだろう?⇒TREEVIEW::GetScrollValueではフェーズがDRAWSTAGEのときはTopologicalSortを呼び出すようになっているが,CHAOTICSTATE未満では呼び出さないようにした.これで初期起動のときTopologicalSort呼び出しが重複するのは回避できるようになったが,今度はインポートのとき.TREEVIEW::GetViewSizeでbasenum=0で停止するようになった.この辺りはDLLを並行してデバッグできないと手も足も出ない.

.NETアプリとDLLを同時にデバッグするということは可能だろうか?しかも,一方はVS2019で他方はVS2017だ.2つのプロジェクトを完全に合体させて一つのソリューションに仕立てるということも場合によっては不可能ではないとは思われるが… .NETアプリは別として,EXEをコマンドプロンプトから起動してデバッグすることは可能なのではないか?⇒VBのプロパティ→デバッグ→開始オプション→コマンドライン引数で引数を渡すことができる.これは便利だ!これでコマンドライン起動時も完璧にデバッグできる.

上記のGetViewSizeのエラーは,GetScrollValueの中で起きている.このエラーを無視しても動作上特に問題は見られないので,入口でゼロ復帰するようにしておく.OpenFileProcが2度呼びされるというのは,MDIParentのロード時に,OpenTestでない場合にはInitFileを実行しているためだ.この処理は,ZELファイルのアイコンをダブルクリックで起動した場合に必要となるため,省くという訳にはゆかない.OpenTestはコマンドライン引数にディレクトリが入っているので識別できるが,ダブルクリックの場合には拡張子を見るしかない.

インポートの場合はInitFileを実行しないようにしてOpenFileProcの二度呼びは回避できるようになったが,結果はなお悪い.51725のコラッツ数列で5点のチェーンになるはずが,後ろ半分が千切れている.InitFileの中には何か必要な処理が入っているようだ.⇒副作用としては新規カードを一枚初期表示するというだけのなので,ここのところを詰めるのは後回しにしておこう.

画面外の部分が描画できないという問題は,インポートだけでなく,ダブルクリック起動の場合にも起きている.かなり厄介な問題だ.しかし,メニューコマンドからのインポートや保存したZELファイルのオープンなら問題なく開けているので,何か些細な漏れがあるものと思われるのだが…⇒何か,画面が暗幕のようなもので遮られているような感じだ.初期表示されていない部分をスクロールで見えるようにして,マウスドラッグで拡張選択しようとしても選択枠線を描画することができない.しかし,描画できている領域から始めると選択矩形をドラッグに従って描画できる.しかも,このとき「不可視領域」までの選択矩形が入り込んだ途端,すべての図形が見えるようになる.謎としか言えない.

何が問題かと言えば,「コントロールサイズ」だろう.コントロールサイズは基本的に系図外枠サイズに一致しているはずなのだが…

▲ZTの実行中,開発環境を落とそうとしてフェーズエラーが発生した.

image

その後,プロジェクトを1/5アンロードしたところで例外が発生した.

image

System.ArgumentException: 値が有効な範囲にありません。
    場所 Microsoft.Internal.VisualStudio.Shell.Interop.IVsSolutionBuildOrderPrivate.GetBuildOrderList(Boolean fForceRecalculation, UInt32 cProjects, VsProjectBuildOrder[] pBuildOrder, UInt32& pValidationId)
    場所 Microsoft.VisualStudio.ErrorListPkg.Shims.TaskListBase.RecalculateProjectRank()
    場所 Microsoft.VisualStudio.ErrorListPkg.Shims.TaskListBase.OnEntriesChanged(Object sender, EntriesChangedEventArgs e)
    場所 Microsoft.VisualStudio.Text.Utilities.GuardedOperations.RaiseEvent[TArgs](Object sender, EventHandler`1 eventHandlers, TArgs args)
— 直前に例外がスローされた場所からのスタック トレースの終わり —
    場所 Microsoft.VisualStudio.Telemetry.WindowsErrorReporting.WatsonReport.GetClrWatsonExceptionInfo(Exception exceptionObject)

デバッグ中にシャットダウンしようとしたのが悪かったのかもしれない…⇒どうも,かなり状態が悪くなっている.VS2017が立ち上がらなくなってしまった.⇒シャットダウンして再起動で立ち上がった.カスペルスキーから2件の「脅威」を検出したという警告が出た.

image

「ユーザに損害を与える目的で悪用される可能性のある正規のソフトウェア」というのはこれまでも何度も出現しているが,今回のは捕獲された場所がマイクロソフトの管轄域であるというところが違う.いずれもZelkovaTree2022.exeで作成時刻は午前1時36分.開発用フォルダに残っているEXEはリリース版が23:00,デバッグ版が23:37でそれより後に作られている.捕獲場所には同じ時刻に作られたPDB(シンボルファイル)も入っている.「解決」ボタンで削除できないため,「駆除して再起動」になった.カスペルスキーはこれを「特別な駆除」と呼んでいる.再起動すると以下のパネルが表示された.

image

このパネルはいつも「特別な駆除」の後に出てくるようだ.これを閉じると,今度はカスペルスキーの完全スキャンが始まる.2TBの外付けHDDが接続したままなので丸一日掛かるかもしれない.カスペルスキーのスキャンはウィンドウを閉じてもバックグラウンドで実行を続けるので一旦閉じておこう.一応捕獲場所をチェックしておこう.⇒一つはフォルダごと削除されているが,もう一つはProjectAssemblyフォルダの中にPDBが残っていた.⇒障害が再現できるかどうかやってみた.デバッグを開始して,ZTがCSVをインポートした後,開発環境をクローズボックスで閉じるという操作だが,問題なく閉じることができた.

MDIForm_Loadでコマンドライン引数で実行するところの論理を少し整理して見通しよいものにしておきたい.できれば,すべてを一つのOpenFileProcの中で処理したいのだが…

▲OpenFileProcではMakeNewObjectで毎回Child配列を初期化しているが,不要なのではないか?ClearChildで間に合うはずだ.

初期表示された画面上のカードをクリックないし選択することでノーマルな状態になる.これはどういうことだろう?カードのクリックというのはOCXに入り,そこから折り返してVBに戻るという動作になっているはずだから,OCX側からの何かしらの応答が必要ということではないだろうか?再描画というのは逆にVBからOCXへの伝達になるので,何の効果もないのではないか?⇒系図画面上でクリックイベントを発生させれば,擬似的に動作するのではないか?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA