Documentação do Steamworks
Depuração da API do Steamworks

Visão geral

O Steam tornou-se um aplicativo complexo ao longo dos anos, oferecendo vários módulos separados e muitas formas diferentes de depuração. Esta página detalha muitas dessas formas, ajudando a tirar proveito do Steam e Steamworks sem muitas dores de cabeça.

O Steam automaticamente salva alguns relatórios de depuração na pasta logs; para outros, pode ser necessário usar Parâmetros de linha de comando do Steam ou Comandos do console do Steam para ativá-los.

O uso da interface ISteamUtils::SetWarningMessageHook permite que um aplicativo Steamworks registre uma função que permite que a API do Steamworks ofereça mensagens de erro legíveis ao aplicativo quando algo der errado. A maioria das APIs do Steam a usa, então não se esqueça de usá-la e dar uma olhada sempre que algo der errado.

Parâmetros de linha de comando do Steam

O Steam usa parâmetros de linha de comando para expor detalhes de desenvolvimento.
  • -console — Ativa o console do Steam, que exibe dados de depuração adicionais e permite o uso de Comandos do console do Steam. Também pode ser ativado ao acessar o URI steam://open/console em um navegador ou pela janela Executar do Windows (Win + R);
  • -debug_steamapi — Ativa a depuração da API do Steamworks. Obrigatório para o uso da interface ISteamUtils::SetWarningMessageHook!
  • -lognetapi — Salva todos os dados de rede P2P no arquivo log/netapi_log.txt;
  • -log_voice — Salva dados de conversa por voz no arquivo logs/voice_log.txt;
  • -installer_test — Altera a instalação de um jogo de varejo para colocar os arquivos na pasta install_validate/ e não no cache do Steam.

Comandos do console do Steam

Além de oferecer saída adicional para relatórios, o console do Steam pode ser usado para invocar comandos no cliente ou servidores Steam. Confira abaixo alguns comandos úteis para depuração.
  • find <string> — Permite a busca por outros comandos úteis;
  • set_spew_level — Permite definir um maior nível de saída no console do Steam, assim como arquivos de relatório. Ex.: "set_spew_level 4 4" — Ativa relatórios mais verbosos, sendo útil para solucionar problemas;
  • app_info_print <ID do aplicativo> — Exibe todos os dados do jogo informados pelos servidores Steam;
  • enable/disable_license <ID do pacote> — Permite o teste de titularidade de aplicativo, tipicamente conteúdo adicional;
  • testappcloudpaths <ID do aplicativo> — Permite o teste de configurações de nuvem automática antes de ativá-la para todos os usuários. O comando só funciona para um ID de aplicativo por vez e precisa ser executado em todos os clientes que desejam testá-la;
  • log_callbacks <ID do primeiro callback> <ID do último retorno de chamada> — Exibe todos os retornos de chamada no console;
  • log_matchmaking_callbacks <0|1> — Ativa/Desativa a exibição de retornos de chamada da criação de partidas;
  • log_ipc <counts|verbose> <filter> — Consulte Relatórios da API do Steamworks.

Relatórios da API do Steamworks

O comando log_ipc (no console do Steam) exibe todas as chamadas IPC (comunicação entre processos) feitas às interfaces internas do Steam. O comando recebe um parâmetro "filter", que pode ser a interface que deseja monitorar ou o nome do processo. Observe que os nomes fornecidos nem sempre são iguais às versões ISteam*, mas costumam ser parecidos. Especificar "counts" ou "verbose" é opcional (padrão: counts).

O fluxo padrão costuma ser similar a:
00000009 my_exe_name.exe:05 > IClientUser::GetSteamID( ) = [U:2:172006], 00000009 my_exe_name.exe:05 > IClientUser::BLoggedOn( ) = 1, 00000009 my_exe_name.exe:05 > IClientNetworking::IsP2PPacketAvailable( 0, ) = 0, 0, 00000009 my_exe_name.exe:05 > IClientNetworking::IsP2PPacketAvailable( 1, ) = 0, 0, 00000009 my_exe_name.exe:05 > IClientFriends::GetPersonaName( ) = "user", 00000009 my_exe_name.exe:05 > IClientUser::GetSteamID( ) = [U:2:123456],

Monitoramento de uma interface específica

Se estiver tentando solucionar um problema específico, filtre o log_ipc para a interface em uso.

Ex.: log_ipc IClientUser

Exemplo de saída:
00000009 my_exe_name.exe:05 > IClientUser::GetSteamID( ) = [U:2:172006], 00000009 my_exe_name.exe:05 > IClientUser::BLoggedOn( ) = 1, 00000009 my_exe_name.exe:05 > IClientUser::GetSteamID( ) = [U:2:123456],

Relatório IPC

Um relatório de rollup está disponível ao comando log_ipc no cliente Steam.

O relatório de rollup exibe um resumo de chamadas IPC. O exemplo abaixo revela que a função GetSteamID/BLoggedOn/GetPersonaName é chamada demais. O relatório é exibido quando o uso de relatórios for desativado ou reiniciado; então, para recuperar o relatório abaixo é preciso seguir os seguintes passos:

  • Digitar "log_ipc nome_do_meu_executavel.exe".
  • Aguardar/Interagir com o jogo para tentar reproduzir um problema/etc.
  • Digitar "log_ipc 0".

Exemplo de saída:
Calls over the last 42144 milliseconds: Process Method Calls First Last -------------------- ---------------------------------------- ---------- ---------- ------- my_exe_name.exe IClientNetworking::IsP2PPacketAvailable 15272 9 42145 my_exe_name.exe IClientUser::GetSteamID 42652 9 42145 my_exe_name.exe IClientUser::BLoggedOn 42652 9 42145 my_exe_name.exe IClientFriends::GetPersonaName 3820 9 42145 my_exe_name.exe IClientUser::RequestEncryptedAppTicket 2 2103 2441 my_exe_name.exe IClientUtils::GetAPICallResult 2 2125 2441 my_exe_name.exe IClientUser::GetEncryptedAppTicket 1 2136 2136

Saída do relatório IPC

O relatório IPC completo é salvo no diretório de instalação do Steam: logs\ipc_SteamClient.log