リンク切れ調査中に終了する現象
JCBookmark 3.1 でリンク切れ調査中に急に終了してしまうことがあるようです。
(3.0 でも発生する。)

アプリケーション自体が終了してしまうのでログを見ることも出来ません。
特定の URL で問題が発生するわけではなく、数十個目で終了してしまうこともあれば八百個近い URL の調査で問題が起こらないこともあります。
再現条件は絞れませんでした。

ただ、デバッガ (gdb) で追跡してみるとメモリ 0x010a1e51 の実行中にメモリアクセス違反を引き起こしているようです。
ソースコードからビルドできる環境を私の手元に構築できていないのでこのアクセス違反がソースコード上のどこに対応付くのかはわかりません。
メモリ管理まわりでなんらかのバグが潜んでいそうです。
  • 齊藤
  • 2022/04/18 (Mon) 10:53:14
Re: リンク切れ調査中に終了する現象
齊藤さん

ありがとうございます。
はい、ご指摘のリンク切れ調査中にアクセス違反が発生してしまう現象は、私の環境でも発生していました。

ただ、アクセス違反の発生場所がJCBookmarkのソースではない外部ライブラリの中だったり、
いつも同じ場所で落ちるわけでもなかったり、デバッグビルドでは発生しなかったり、
難しい状況になって原因を特定できないままでした・・。

gdbはWindows版もあるのでしょうか?私は使ったことがありませんでした。

たしかにメモリ管理でどこかに不具合があるかもしれませんが、上記のように難しい状況になったため、
そもそもの動作方式をマルチスレッドからマルチプロセスに変更して異常終了を回避するようにすべきか
と考えながら、なかなか実行に移せずにいました。

デバッグツール的なものもそれほど詳しくなく追いかけてきれていないだけかもしれませんが・・。

原因特定か、動作方式変更か、どちらにせよちょっと時間がかかりそうですが、
もう一度検討したみたいと思います。
  • ZTMS(管理人)
  • 2022/04/19 (Tue) 13:47:11
Re: リンク切れ調査中に終了する現象
デバッガは起きたことを追跡することが出来ますが潜在的な問題の洗い出しが出来ないのでタイミング次第で問題が出たりでなかったりする場合にはまずはアドレスサニタイザを導入すべきだと思います。
メモリの確保・解放・アクセスの状況を監視し、異常を検出するツールです。 (静的な解析も含みます。)
アドレスサニタイザは一般的に開発ツール・実行環境と連携するのですが、私は Visual C++ については明るくなく、残念ながら適切な助言ができません。
ざっとウェブ検索したところ Visual Studio 2019 バージョン16.9 以降がアドレスサニタイザをサポートしていると書かれているのでこれを使うのがおそらく一番楽な方法ではないかと思います。
(最初から連携する前提で用意されているので変な相性問題や設定の面倒くささがないと期待できそうという漠然とした感想なのであまりあてにしないでください……。)
https://docs.microsoft.com/ja-jp/cpp/sanitizers/asan?view=msvc-170

デバッガについては、 gdb に Windows 版はあります。
しかし、使い慣れたものがないのであれば Windows 上で使いやすいのは x64dbg だと思います。
https://x64dbg.com/
コマンドラインインターフェイスだと能動的に調べたいところを指示しないといけませんが、ビジュアル化したインターフェイスで状況をまるごと見れると問題が把握しやすいように感じます。
  • 齊藤
  • 2022/04/19 (Tue) 18:48:52
Re: リンク切れ調査中に終了する現象
齊藤さん

ありがとうございます!
アドレスサニタイザなるほど、このようなものがあるのですね。
無料のCommunity版でも使えるのかな・・試してみたいと思います!

ビルドにはずっと Visual Studio 2008 Express を使っていました。
いちおうメモリリークのチェックやヒープオーバーフローの自力チェックはしていたのですが、
もしスタックオーバーフローがあっても難しくてわからないなぁ・・と思っていました。

x64dbgも使ったことがありませんが、Visual Studioのデバッグ実行だと発生しないような症状の時に有用ということでしょうか。
こちらも調べてみたいと思います。

齊藤さんはUNIX系のC/C++プログラマだったりするのでしょうか??
大変ためになる情報ありがとうございました!
  • ZTMS(管理人)
  • 2022/04/21 (Thu) 01:52:34
Re: リンク切れ調査中に終了する現象
主要なデバッガはデバッグシンボルを理解します。 デバッグシンボルは実行ファイルのどこがソースコードのどれに対応付けられるのかの情報です。
x64dbg の場合は PDB 形式のシンボルファイルをサポートしており、これは Visual C++ を使ってビルドしていれば生成されるはずです。 Visual Studio 2008 でも生成されるようです。
デバッガでニーモニックの羅列を見ながら詳細な分析をするのはかなり慣れないと無理だと思いますが、メモリアクセス違反が起きたのがどこかはわかりますし、それがソースコード上のどの関数内で起きているかもわかります。 大抵の場合はどこで起きているかさえわかればあとはそんなに難しくないと思います。 (いろんな問題のコンボが絡み合ってわけがわからないときもたまにはありますが……。)

私は趣味でプログラミングをしています。 今は Windows プログラミングしかしていませんが、マイクロソフトが開発環境を無料で提供しはじめる前 (MS-DOS 時代) から GCC を使っているのでその流れのまま Visual C++ を使わずにきてしまいました。
  • 齊藤
  • 2022/04/21 (Thu) 18:42:17
Re: リンク切れ調査中に終了する現象
齊藤さん

ありがとうございます。
GCCがそんなに昔からずっとWindowsで使えていたとは・・知りませんでした。
私は何年かはLinuxのCプログラムの仕事をしていた時代もありましたが、今はWeb/PHPメインの会社員をしています。。

ニーモニックを眺めてデバッグというのはちょっと私にはハードルが高い現状です・・・(アセンブラの学習したこともあったけど身につくところまでいかず・・)

ひとまず Visual Studio 2022 Community をインストールしてみたところ AddressSanitizer が使えるようでした。
静的解析では特に何も言われていないようで、ビルドしてみたのですが、リンクエラーになりました。
このあたりの話か・・
https://araramistudio.jimdo.com/2017/05/12/c-lnk2019-%E6%9C%AA%E8%A7%A3%E6%B1%BA%E3%81%AE%E5%A4%96%E9%83%A8%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB-sscanf-%E3%81%8C%E9%96%A2%E6%95%B0-xxx-%E3%81%A7%E5%8F%82%E7%85%A7%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F/

このあたり解決して実行してみたいと思います。
  • ZTMS(管理人)
  • 2022/04/22 (Fri) 12:01:58

返信フォーム






プレビュー (投稿前に内容を確認)