Для загрузки версий игры для разработчиков на Steam Deck см. https://partner.steamgames.com/doc/steamdeck/loadgames
См. 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 )