1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-ValveProton

Клонировать/Скачать
DEBUGGING.md 9.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 25.05.2025 13:36 08025ed

Советы по отладке Proton

Для загрузки версий игры для разработчиков на Steam Deck см. https://partner.steamgames.com/doc/steamdeck/loadgames

Отладка сборок Proton

См. README.md#отладка.

Прикрепление отладчика

Запуск GDB и прикрепление к запущенному .exe работает из коробки:

$ ps | grep Игра
2263566 ?        tsl    0:09 Z:\home\ivyl\.local\share\Steam\steamapps\common\Игра\Игра.exe

$ gdb
GNU gdb (GDB) 14.1
...
(gdb) attach 2263566
Прикрепление к процессу 2263566
[Новый LWP 2263569]
...
0x000075dce0cd788d в ?? ()

С Proton Experimental (и >= 9.0-2), GDB должен быть способен загрузить символы сразу. Однако, для наилучшего опыта вы захотите использовать кастомную версию GDB с несколькими патчами для лучшей интеграции с Wine.

Вы можете найти этот форк по адресу https://gitlab.winehq.org/rbernon/binutils-gdb, который можно собрать с помощью configure && make all-gdb && make install-gdb. Убедитесь, что установлены пакеты разработки Python, так как поддержка Python в GDB будет необходима.

С этой кастомной версией GDB вы можете source кастомного unwinder Wine в вашем ~/.gdbinit, и вы получите трассировки стека через границы PE / unix.

С более старыми версиями Proton вы можете использовать source gdbinit Wine для доступности команды load-symbol-files, которая использует /proc/$pid/maps для загрузки символов:

(gdb) source ~/src/proton/wine/tools/gdbinit.py
```(gdb) load-symbol-files
загрузка символов для /home/ivyl/.local/share/Steam/steamapps/common/Proton - Experimental/files/lib64/wine/x86_64-windows/kernelbase.dll
...(gdb) bt
#0  0x000075dce0cd788d в ?? ()
#1  0x000075dcdf26e842 в futex_wait (timeout=0x0, val=0, addr=0x75dcdd8383e0) в ../src-wine/dlls/ntdll/unix/sync.c:127
#2  NtWaitForAlertByThreadId (address=<оптимизировано>, timeout=0x0) в ../src-wine/dlls/ntdll/unix/sync.c:2658
#3  <обработчик сигнала вызван>
#4  0x000000017000ebb4 в NtWaitForAlertByThreadId ()
#5  0x00000001700367f9 в RtlWaitOnAddress (addr=addr@entry=0x4850970, cmp=0x3d12fa9c, cmp@entry=0x3d12fabc, size=size@entry=4, timeout=timeout@entry=0x0) в ../src-wine/dlls/ntdll/sync.c:941
#6  0x000000017003276a в RtlSleepConditionVariableSRW (variable=0x4850970, lock=0x4850908, timeout=0x0, flags=<оптимизировано>) в ../src-wine/dlls/ntdll/sync.c:837
#7  0x000000007b061e41 в SleepConditionVariableSRW (variable=<оптимизировано>, lock=<оптимизировано>, timeout=<оптимизировано>, flags=<оптимизировано>) в ../src-wine/dlls/kernelbase/sync.c:1064
#8  0x000000035915c892 в dxvk::condition_variable::wait (lock=..., this=0x4850970) в ../src-dxvk/src/dxvk/../util/log/../thread.h:251
#9  dxvk::condition_variable::wait<dxvk::DxvkPipelineWorkers::runWorker(dxvk::DxvkPipelinePriority)::<lambda()> > (pred=..., lock=..., this=0x4850970) в ../src-dxvk/src/dxvk/../util/log/../thread.h:257
#10 dxvk::DxvkPipelineWorkers::runWorker (this=0x48508f0, maxPriority=dxvk::DxvkPipelinePriority::Normal) в ../src-dxvk/src/dxvk/dxvk_pipemanager.cpp:140
#11 0x00000003591a7781 в std::function<void ()>::operator()() const (this=0x4852ee0) в /usr/x86_64-w64-mingw32/include/c++/10.3.0/bits/std_function.h:622
#12 dxvk::thread::threadProc (arg=0x4852ed0, arg@entry=<ошибка чтения переменной: значение оптимизировано>) в ../src-dxvk/src/util/thread.cpp:68
#13 0x000000007b6146ed в BaseThreadInitThunk (unknown=<оптимизировано>, entry=<оптимизировано>, arg=<оптимизировано>) в ../src-wine/dlls/kernel32/thread.c:61
#14 0x000000017000f1a7 в RtlUserThreadStart ()
#15 0x0000000000000000 в ?? ()

Подключение перед запуском программы
------------------------------------Запустите программу с параметром `PROTON_WAIT_ATTACH=1 %command%` в качестве команды запуска в свойствах игры. Наша вставка `steam.exe` будет ждать подключения отладчика и только затем запустит соответствующий исполняемый файл.

Убедитесь, что вы следите за дочерними процессами:

set follow-fork-mode child


Получение оболочки внутри Steam Runtime
----------------------------------------

Установите ваши параметры запуска следующим образом: `PROTON_LOG=1 STEAM_COMPAT_LAUNCHER_SERVICE=proton %command%`

Затем в файле `steam-$GAMEID.log` вы должны увидеть следующее:

Запуск программы с использованием сервиса запуска команд.

Для выполнения команд в контейнере для конкретной игры используйте команду вида:

/home/ivyl/.local/share/Steam/steamapps/common/SteamLinuxRuntime_sniper/pressure-vessel/bin/steam-runtime-launch-client
--bus-name=:1.307
--directory=''
--
bash


После выполнения этой команды вы окажетесь в оболочке с установленными переменными окружения, включая `WINEPREFIX`, и сможете запустить `wine` напрямую, например:

[ivyl@crabcraft x64]$ wine winedbg Wine-dbg> info process pid threads executable (все id:s в шестнадцатеричном формате) 0000028c 1 'start.exe' 0000029c 1 _ 'winedbg.exe' =000002a4 1 _ 'winedbg.exe' 00000294 2 _ 'conhost.exe' 00000030 10 'services.exe' 000000e4 6 _ 'rpcss.exe' 000000b0 3 _ 'svchost.exe' 00000094 6 _ 'plugplay.exe' 00000064 9 _ 'winedevice.exe' 0000003c 8 _ 'winedevice.exe' 00000020 3 'steam.exe' 00000128 62 _ 'Game.exe' 000000d0 3 _ 'explorer.exe' 0000010c 3 _ 'tabtip.exe' ```Примечание: Если вам требуется предсказуемое имя шины вместо уникального имени соединения (например, :1.307 в примере выше), вы можете использовать `com.steampowered.App1234567`, где 1234567 — это Steam App ID для игры, которую вы отлаживаете.

Вы всегда можете использовать инструмент, такой как qdbus, чтобы перечислить доступные имена шин.

Запуск другого исполняемого файла

Если вы хотите запустить другой исполняемый файл, отличный от стандартного для игры, вы можете использовать несколько методов. Всякий раз, когда приведены примеры ниже, используется winecfg.

Подстановка

Вы можете использовать следующий параметр запуска:

echo "%command%" | sed 's/proton waitforexitandrun .*/proton waitforexitandrun winecfg/' | sh

Полная подстановка proton waitforexitandrun .* необходима, так как оригинальная команда %command% очень длинная и может содержать несколько упоминаний proton или исходного бинарного файла.

Оболочка сосуда под давлением

Сосуд под давлением позволяет запустить xterm вместо запуска Proton. Это можно сделать, установив PRESSURE_VESSEL_SHELL=instead. Самый простой способ — установить параметр запуска на:

PRESSURE_VESSEL_SHELL=instead %command%

Оригинальная команда затем содержится в $@, например:

/home/ivyl/.local/share/Steam/steamapps/common/SteamLinuxRuntime_sniper/pressure-vessel/bin/steam-runtime-launcher-interface-0 container-runtime /home/ivyl/.local/share/Steam/steamapps/common/Proton - Experimental/proton waitforexitandrun /home/ivyl/.local/share/Steam/steamapps/common/Game/Game.exe
```С этого момента можно запустить скрипт `proton`, так как все необходимые переменные окружения установлены. Если вы копируете путь из `$@`, убедитесь, что экранируете или цитируете части, содержащие пробелы.

Чтобы запустить `winecfg`, можно ввести что-то вроде этого:

"/home/ivyl/.local/share/Steam/steamapps/common/Proton - Experimental/proton" waitforexitandrun winecfg


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-ValveProton.git
git@api.gitlife.ru:oschina-mirror/mirrors-ValveProton.git
oschina-mirror
mirrors-ValveProton
mirrors-ValveProton
proton_9.0