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)

관련 정보