社内SEの徒然なる日記

NetCOBOLでロードモジュールからSQLを取り出す

状況

過去データを一括で削除するってプログラムがあって、元々は5年経過したデータを削除していたのですが、ハードに余裕が出来たので、期間を5年から10年に変更しました。

んで、テスト環境には4年分のデータを突っ込んで実行したところ、なぜかログに130件の削除件数が表示されました。
釈然とせず、コンパイル前のロードモジュールをテスト環境に戻して再テストしたところ、今度は削除件数は0件。

プログラムを見直しても、別段間違えてはいない。
ここから悪夢は始まりました(--;)

ソース紛失

いろいろと資料を漁って調べた結果、数年前に消してはならないデータを消してしまうバグがあったらしく、このプログラムを修正していたらしいです。
障害の報告書と、テスト環境で消えた130件の条件を付き合せたところ、ピッタリと条件に該当。
ちなみに、修正前のソースコードのタイムスタンプは、この障害より以前の日付。

どうやら、障害時に修正したソースをSubversionに登録しなかったようです。
しかも、仕様書も修正されていなかったため、当時にどのような修正をしたのかも不明。

マジ、勘弁してくれ(-_-)/~~~ピシー!ピシー!

ファイルの探索

どっかにソースがあると信じて、サーバーを検索してみました。
cdコマンドでルートディレクトリに移動して、findコマンドを実行します。


find . -name "プログラム名" -print


全てのサーバ(Windows系も含む)を調べたのですが、見つからない、又は修正されていないソースでした。

逆コンパイル

まず考えたのが、ロードモジュールからソースコードを復元できないかってことです。
つまり逆コンパイルですね。

javaとかの言語なら、結構ツールが転がっているので、COBOL用もないかと期待したのですが、見つけ出すことが出来ませんでした。
...需要はありそうだし、私が探せなかっただけで、存在しないってわけじゃないと思うんですけどね。

SQLトレース

障害の原因から考えて、修正した箇所はSQLの抽出条件と考えられました。
そこで、OracleのSQLトレースを使用してSQLを抜き出してやることを思いつきました。

まず、オラクルの設定をいじってSQLトレースを有効にします。
次に、本番環境のロードモジュールを、開発環境にコピーします。
問題のプログラムのみを実行するシェルを作成して、実行します。
トレースファイルから、実行されたSQLを抜き出して、現在のソース中のSQLと比較して差異を見つけ出して、ソースを修正します。

結果、修正後のロードにはWHERE句が1行追加されていることが分りました。
それをヒントに、こんな感じでソース修正してみます。


AND ABCD.TEST < '0000000000'


ただ、SQLトレースの結果にはホスト変数の値が出力されないようなので、完全な再現ができないのが気になります。
つまり、'0000000000' の部分が本当に正しいのかが分らない。

ロードモジュールのバイナリ比較

完全復旧を求めて知恵を絞ったのですが、結局ロードモジュールをバイナリレベルで比較してみることにしました。
まず、修正したソースをコンパイルして、ロードモジュールを作成します。
次に作成したロードモジュールと、本番環境で使用しているロードモジュールをバイナリレベルで比較します。

※ 比較には、フリーソフト「Stirling(スターリング)」を使用しました。

差異がある箇所を調べていて気付いたのですが、なんかロードモジュール内にSQLがそのまま表示されてるんですよね。
もしやと思って、ロードモジュールをテキストエディタで開いたところ、SQLを見ること出来ました。
...最初にこれを知っていれば、わざわざSQLトレースを仕込むこともなかったんだが(--;)
んで、あらためて差異を調べてソースを再修正。


AND ABCD.TEST < '9900000000'


'0000000000' 部分は '9900000000'が正しかったようです。

これを元に、再度バイナリエディタで比較して差異を確認します。
ロードモジュールにはコンパイルした日時も設定されるようで、完全には一致しませんでした。
まぁ、明らかに日付だったので、そこは無視したのですが、あと一か所だけどうしても一致しない(--;)

いろいろ試したのですが、どうやら日付以外の情報でもコンパイルするたびに書き換わる項目があるようです。
ためしにソースをいじらずにコンパイルして、ロードを比較してもその場所で差異が発生する。

なので、これで間違いないと想定して修復終了です。
はぁ、長かった...

前回:NetCOBOLのサブルーチン修正でORA-01413発生
次回:NetCOBOLのエラー事例
投稿記事の一覧 : http://harikofu.blog.fc2.com/blog-entry-22.html

--- blog end ---


スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する