저는 wine example.exe
Wine을 통해 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)