Wineデバッガを無効にしてプロセスを終了します。

Wineデバッガを無効にしてプロセスを終了します。

私はwine example.exeWineを介してWindowsプログラム(例:)を実行しています。このプログラム(またはWineの可能性が高い)は、アプリケーションを閉じるときに完全に終了するのではなく、端末に次の読み取りアクセス例外が発生するという点で興味深い動作を持っています。

wine: Unhandled page fault on read access to 0x00000018 at address 0x7f7969ea (thread 0009), starting debugger...

その結果、プログラムを完全にシャットダウンすることはできず、プログラムを閉じるにはターミナルでCtrl-Cまたはkill -9それを押す必要があります。

質問:未処理のページエラーが発生したときにターミナル出力に示すようにデバッガを起動するのではなく、wineプロセスを終了する方法はありますか? (注:デバッガは実際には起動しません。ワインデバッガの起動中にエラーが発生したと文句を言う後続のメッセージがあります。)

答え1

これを行う標準的な方法は、HKEY_LOCAL_MACHINE\Software\Wine\winedbgキーを生成し、DWORD値ShowCrashDialogを0に設定することです。

答え2

このPythonスクリプトは、コメントで@chzzhによって提案された回避策を実装します。デフォルトでは、ワインプロセスのstderrを読み取り、指定された文字列を見つけたら強制終了します(たとえば、starting debugger...stderrでその文字列を見つけた場合)。

使用方法は次のとおりです。以下のスクリプトをwatcher.py別の名前で保存してください。それから

python3 ./watcher.py 'starting debugger...' wine <arguments and exe path for wine>

私はこれをテストし、それは私にとってとてもうまくいきます。

スクリプトは次のとおりです。

#!/bin/python3
import sys
import io
import select
from subprocess import Popen, PIPE, DEVNULL, STDOUT
from sys import argv

def kill_when_found(process, needle, size = io.DEFAULT_BUFFER_SIZE):
    if isinstance(needle, str):
        needle = needle.encode()
    assert isinstance(needle, bytes)

    stream = process.stderr
    assert stream is not None

    poll = select.poll()
    poll.register(stream, select.POLLIN)

    output_buffer = b''
    while process.poll() is None:
        result = poll.poll(100)
        if not result:
            continue

        output = stream.read1(size)
        sys.stdout.buffer.write(output)
        output_buffer += output
        if needle in output_buffer:
            process.kill()
            return process.poll()

        if len(output_buffer) >= len(needle):
            output_buffer = output_buffer[-len(needle):]

    return process.poll()

if __name__ == '__main__':
    if len(argv) <= 3:
        print("""
Usage: Pass in at least 2 arguments, the first argument is the search
string;
the remaining arguments form the command to be executed (and watched over).
""")
        sys.exit(0)
    else:
        process = Popen(argv[2:], stderr = PIPE)
        retcode = kill_when_found(process, argv[1])
        sys.exit(retcode)

関連情報