トップページ > 記事閲覧
【不具合?】Debugビルドのみ、localeが絡む処理を行うとクラッシュする
名前:was-blue.0793 日時: 2025/08/17 18:45

いつもお世話になっております。 表題の件につきまして、現在のバージョン(Ver3.24fと、テスト版のVer3.25)ではDXライブラリを使用するプログラムでlocaleが絡む処理を行うと、 Debugビルドのみntdll.dllの内部処理「VirtualProtect」関数でクラッシュするようです。 この問題は、例えば以下の機能に影響します: *setlocale、std::locale::globalの設定など *std::stringstreamの構築 WinMain関数の最初でsetlocaleを設定するようなことをしてもクラッシュするようです。 以下は簡易的な再現コードです: --- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // ロケール設定 std::locale::global(std::locale::classic()); // stringstream の構築 std::stringstream str; // DXライブラリの初期化 if (DxLib_Init() < 0) return -1; // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } --- この問題は2つのWindows環境で発生したことを確認しました。 DXライブラリを使用するプログラムでのみ発生するのでこちらへの書き込みとさせていただいております。 それではよろしくお願いします。
メンテ

Page: 1 |

Re: 【不具合?】Debugビルドのみ、localeが絡む処理を行うとクラッシュする ( No.1 )
名前:みけにゃんこ 日時:2025/08/18 14:53

使用コンパイラー等が記載されていないのでよくわからないですが 社内の2台の開発環境でチェックしました バージョン(Ver3.24fと、テスト版のVer3.25)共に上記ソースでは不具合でません 何だろう? vs2022(v143) SDK バージョン  10.0 (最新のインストールされているバージョン) 文字セット:マルチ ランタイムライブラリ  release:マルチスレッド (/MT)  debug:マルチスレッド デバッグ (/MTd) C++言語(2種類テスト)  暫定(ISO C++14標準)  ISO C++20 標準 C言語  既定 (従来の MSVC) 追加のインクルードはDXライブラリーの手順 その他のパラメーターはさわっていません
メンテ
Re: 【不具合?】Debugビルドのみ、localeが絡む処理を行うとクラッシュする ( No.2 )
名前:was-blue.0793 日時:2025/08/18 18:23

>> みけにゃんこさん 使用コンパイラーはMSVC・VS2022のVer17.14.12です。 Debugビルドのうち、ローカルWindowsデバッガーを使用した場合のみクラッシュします。「デバッグなしで開始」すると起動できるようです。 ビルド設定は以下の通りです: *SDKバージョン 10.0 (最新のインストールされているバージョン) *文字セット マルチバイト文字セットを使用する *ランタイムライブラリ Releaseは「マルチスレッド」Debugは「マルチスレッドデバッグ」 *C++言語標準 「ISO C++20 標準」または「プレビュー - ISO C++23 標準」 *C言語標準 「ISO C17 (2018) 標準」 その他はDXライブラリ説明書の記述通り
メンテ
Re: 【不具合?】Debugビルドのみ、localeが絡む処理を行うとクラッシュする ( No.3 )
名前:みけにゃんこ 日時:2025/08/19 12:46

エラー確認 @.「ローカル windows デバッガー」を使用しないで   デバッグビルドしてその実行ファイルを直接実行してエラー発生しますか? A.もし、ゲームのアンチチート保護やセキュリティソフトウェアがバックグランドで動作しているなら停止してから   「ローカル windows デバッガー」実行してどうなるか?   まあ、アンチチート保護はゲーム起動して無ければ動作しないと思いますが、、 B.出来るだけクリーンなPCでデバッガー起動してどうなるか? --- @が動作するならクラッシュするそのPC環境かVisual Studio側の問題。 とりあえず、クラッシュする寸前をブレイクポイントを設定して 逆アセンブリウィンドウ等で頑張って追いかけるしか手段なさそうですが・・・ 後は、治るか判りませんが 1.ビデオドライバー最新版か確認、※DXライブラリーを使用時だけクラッシュするみたいなので 2.フルスクリーンで起動させないでウインドモードでデバッガー起動ではどうなるか 2.Visual Studio installer >その他>修復 3.Visual Studio再インストール 4.dism / sfc 等でOS確認 5.最悪はOS再インストール、、
メンテ
Re: 【不具合?】Debugビルドのみ、localeが絡む処理を行うとクラッシュする ( No.4 )
名前:was-blue.0793 日時:2025/08/19 18:02

>> みけにゃんこさん ローカルWindowsデバッガーを使用せず、「デバッグなしで開始」とDebugビルドを直接起動するものではクラッシュしないようでした。 Releaseビルドでは「ローカルWindowsデバッガー」を使用してもクラッシュせず起動できます。 VS2022の修復は試したのですが改善されませんでした。
メンテ
Re: 【不具合?】Debugビルドのみ、localeが絡む処理を行うとクラッシュする ( No.5 )
名前:みけにゃんこ 日時:2025/08/21 14:14

ローカルWindowsデバッガー使用時にグローバルロケールとC言語ロケールの設定が食い違っている トラブルみたいな感じですね、、 std::locale::classic()は基本的なロケールを返すだけなのでエラー要因になりにくいのですが std::locale::global()が呼ばれるとCRT内部のファセット構造やメモリ保護ページにアクセスするので 環境やビルド設定によっては VirtualProtect が失敗し、ntdll.dll 内部で例外が発生します。 あと、下記だとローカルWindowsデバッガーでどうなります? <20250821>修正 // テストソース // このソースでデバッガーがエラー時は // DXライブラリーが原因ではありません!! #include "DxLib.h" // #include <windows.h> #include <locale> int WINAPI WinMain(〜〜〜〜) { // ロケール設定 std::locale::global(std::locale::classic()); Sleep(2000); return(0); }
メンテ
Re: 【不具合?】Debugビルドのみ、localeが絡む処理を行うとクラッシュする ( No.6 )
名前:was-blue.0793 日時:2025/08/21 13:47

>> みけにゃんこさん このソースでも例外発生によるクラッシュが発生しました。 検証を進めていたところ、この問題で発生する例外は「first-chance exception」に相当するもので、 この例外で停止した部分から先に進めることができればそのまま動かせることがわかりました。 ntdll.dllから発行される例外で停止しないように設定することにより回避することができるようですが、 アクセス違反での停止になっているので懸念もあります。 このまま進めても不都合がないことがわかればこの回避策で進められそうなのですが……
メンテ
Re: 【不具合?】Debugビルドのみ、localeが絡む処理を行うとクラッシュする ( No.7 )
名前:みけにゃんこ 日時:2025/08/21 15:00

上記ソース(ちょっと修正しました)ではDXライブラリーは一切使用していない状態になるので デバッガーでエラー発生はDXライブラリーは無関係となります。 今回のデバッガーのエラーは開発環境依存かな〜〜 デバッガーを使用しないバージョンでロケール設定が正常に行われているのが 確認できれば製品版は問題ないと思われます。 解決にはならないのですがデバッガー使用時は「std::locale::global(std::locale::classic())」に 例外処理入れて回避するしかなさそうです。 でも普通、フォールバック時はlocale::classic()選ぶからどうしたらいいか謎(汗
メンテ
Re: 【不具合?】Debugビルドのみ、localeが絡む処理を行うとクラッシュする ( No.8 )
名前:was-blue.0793 (一旦解決) 日時:2025/08/25 22:45

>>みけにゃんこさん 現時点ではntdll.dllで発生するFirst Chance Exceptionを止めれば動かすことができるようになっている状況で、 不可解な点は残りますがローカルWindowsデバッガーでクラッシュするような状態はなくなったものと思います。 一度解決にしておきますが、根本的な解決方法が見つかったら追記できるようにします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存