C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: コマンドラインソフトが強制終了する原因


(過去ログ 176 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■101247 / inTopicNo.1)  コマンドラインソフトが強制終了する原因
  
□投稿者/ こうこう (1回)-(2023/01/22(Sun) 20:23:10)

分類:[.NET 全般] 


あるコマンドラインソフトをVB.NETで実行したいのですが、
以下のコードで実行した時に、

Dim psi As New System.Diagnostics.ProcessStartInfo()
psi.FileName = """" & Stride_Path & """"
psi.Arguments = "出力ファイル名"

psi.WindowStyle = ProcessWindowStyle.Hidden

Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)

p.WaitForExit()

デバッグモードだとうまく実行できます。

しかし、リリースしたEXEファイルで実行すると以下のエラーが出て
そのコマンドラインソフトが強制終了してしまいます(.NETのソフトは落ちません)。

〜〜は動作を停止しました
問題が発生したため、プログラムが正しく動作しなくなりました。このプログラムを閉じてください。
[プログラムを終了します] [プログラムをデバッグします]

また、batファイルで同じコードを走らせても
エラーは出ないのですが、
リリースしたEXEファイルだけエラーが出るのはなぜでしょうか?


引用返信 編集キー/
■101248 / inTopicNo.2)  Re[1]: コマンドラインソフトが強制終了する原因
□投稿者/ Azulean (1261回)-(2023/01/22(Sun) 21:54:10)
No101247 (こうこう さん) に返信
> しかし、リリースしたEXEファイルで実行すると以下のエラーが出て
> そのコマンドラインソフトが強制終了してしまいます(.NETのソフトは落ちません)。


今の情報からはわかりません。
強制終了と言うことですから、イベントログに情報が残っていないかを見るところでしょう。

あとは、Arguments に渡している出力ファイルパスが絶対パス(C:\Users\UserName\...\abc.txt のように、ドライブレターから書かれているもの)を指定しているかどうか確認してください。
相対パスの場合は場所が違っていて動かないと言うことがあり得ます。

また、出力パスが C:\Program Files 以下の場合、権限の問題で書き込めていない可能性もあり得ます。
引用返信 編集キー/
■101256 / inTopicNo.3)  Re[2]: コマンドラインソフトが強制終了する原因
□投稿者/ こうこう (2回)-(2023/01/24(Tue) 13:46:57)
ありがとうございます。

> Arguments に渡している出力ファイルパスが絶対パス

絶対パスで設定してあります。


> また、出力パスが C:\Program Files 以下の場合、

出力パスはProgram Files以下ではありません。



ただ、気づいたのですが、
コマンドラインのプログラムが
D:\Program Files2 以下に入っている状態だとエラーが出るのですが、
別のフォルダーに移すとエラーが出ないことが分かりました。

ウイルスソフトを無効にしてみたのですが、
やはりエラーは出るため、これが原因ではなさそうです。


ただ、どうしても分からないのは、
デバッグモードやBatファイルだとエラーは出ません。
またリリースモードでもコマンドラインソフトに読み込ませるファイルサイズが小さい場合にはエラーは出ません。
ファイルサイズが大きいときのみエラーがでます。

そのため、権限が原因ではないと思います。

これは何が原因なのでしょうか?


引用返信 編集キー/
■101305 / inTopicNo.4)  Re[3]: コマンドラインソフトが強制終了する原因
□投稿者/ 伝説のカレー (72回)-(2023/02/01(Wed) 08:42:33)
No101256 (こうこう さん) に返信

エラーメッセージなりスタットトレースなりないと原因を調べるのは難しいと気がします
例外をハンドリングしてログファイルに出力してみるのがいんじゃないでしょうか、事象を正しく理解すれば原因はおのずと明らかになるもんです
引用返信 編集キー/
■101306 / inTopicNo.5)  Re[3]: コマンドラインソフトが強制終了する原因
□投稿者/ とっちゃん (774回)-(2023/02/01(Wed) 10:29:01)
No101256 (こうこう さん) に返信

クラッシュするのは呼び出したコマンドラインのプログラムですよね?
出力ファイル名というのはファイル名だけですか?それともフルパスですか?

ファイル名だけという場合、プログラムを呼び出すときのカレントディレクトリが
そのまま起動先プログラムの起動パスになり、そこにファイルを作ろうとすると思います。

リリースモードと、デバッグモードでは、呼び出し元アプリのある場所が違うとか
そういうことはありませんか?

バッチファイルの場合も同様な気がします。

そのあたりを調べてみるとわかるかもしれません。

引用返信 編集キー/
■101307 / inTopicNo.6)  Re[1]: コマンドラインソフトが強制終了する原因
□投稿者/ 魔界の仮面弁士 (3552回)-(2023/02/01(Wed) 10:38:31)
No101256 (こうこう さん) に返信
> ウイルスソフトを無効にしてみたのですが、
> やはりエラーは出るため、これが原因ではなさそうです。

その手のソフトは、単に無効にするだけでは原因を特定できないことがあります。

そちらの状況としてはまるで異なるのですが、一例として:

☆ClickOnce 配布した WinForms アプリが起動できないとの問い合わせ。
☆KB5016629 が入っていると起動せずに強制終了してしまうが、それをアンインストールしたら問題なく起動することが判明。
★問題が発生する端末はすべて Kaspersky が入っており、動作する端末では Kaspersky が使われていなかった。
★Kaspersky の監視を止めるだけでは駄目だったが、Kaspersky をアンインストールしたところ、KB5016629 が入っていても動いた。
☆22H2 以降では KB5016629 をアンインストールする手法が取れなかったので、Kaspersky があると起動しない状況。
☆強制終了したときにイベントログに 0xc0000005 (STATUS_ACCESS_VIOLATION) の記録が残るが、
 画面上にメッセージ等は何も出ることなく、無言で終了する状態。
☆イベントログによれば、0xc0000005 を発するのは C:\Windows\System32\gdi32full.dll となっている。


> 別のフォルダーに移すとエラーが出ないことが分かりました。
Start メソッドに渡す前に、起動ディレクトリを明示的に指定してみると変化がありますか?
・System.IO.Directory の SetCurrentDirectory メソッド
・System.Environment の CurrentDirectory プロパティ
・System.Diagnostics.ProcessStartInfo の WorkingDirectory プロパティ

標準出力の詰まりで問題が起きることもありますが、
RedirectStandard何某プロパティの設定はどうしていますか?
https://qiita.com/tamura__246/items/5ed6d693480da428fbd5
https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/805pipeasync/pipeasync.html


No101247 (こうこう さん) に返信
> また、batファイルで同じコードを走らせても
> エラーは出ないのですが、
ということは、
> psi.FileName = """" & Stride_Path & """"
> psi.Arguments = "出力ファイル名"

 psi.FileName = "cmd.exe"
 psi.Arguments = "/D /C """ & Stride_Path & """ 出力ファイル名"
にすると、また違った結果になるとか…?


> ファイルサイズが大きいときのみエラーがでます。
データサイズが大きい場合に、stack overflow に陥ってしまうとか。

とある生体認証ライブラリの DLL を呼び出したときに、データ量が多いと
スタック制限に引っかかってしまって認証できないことがあり、
メーカー側の API 側が改修されるまでの間、呼び出し側の EXE のスタックサイズを
 editbin /STACK:スタックサイズ myapp.exe
で拡張する必要があった…という経験があります。今回のケースとは関係なさそうですけれどね。
引用返信 編集キー/
■101322 / inTopicNo.7)  Re[2]: コマンドラインソフトが強制終了する原因
□投稿者/ こうこう (3回)-(2023/02/03(Fri) 22:05:43)

ありがとうございます。


> クラッシュするのは呼び出したコマンドラインのプログラムですよね?
> 出力ファイル名というのはファイル名だけですか?それともフルパスですか?

フルパスで指定しています。


> リリースモードと、デバッグモードでは、呼び出し元アプリのある場所が違うとか
> そういうことはありませんか?

.NETのプログラムの場所はリリースとデバッグモードで異なります、
コマンドラインの場所は同じです。



> Start メソッドに渡す前に、起動ディレクトリを明示的に指定してみると変化がありますか?
> ・System.IO.Directory の SetCurrentDirectory メソッド
> ・System.Environment の CurrentDirectory プロパティ
> ・System.Diagnostics.ProcessStartInfo の WorkingDirectory プロパティ


全てD:\に設定してみましたが変化ありませんでした。


> 標準出力の詰まりで問題が起きることもありますが、
> RedirectStandard何某プロパティの設定はどうしていますか?


InあるいはOutをTrueに変更するとエラーになって実行できません
そのため、Falseにしか設定できません、


>  psi.FileName = "cmd.exe"
>  psi.Arguments = "/D /C """ & Stride_Path & """ 出力ファイル名"
> にすると、また違った結果になるとか…?

これに変更するとこれまでデバッグモードなら実行できていものが
ビルドでもデバッグでも両方とも実行できなくなりました。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -