StutterShark
StutterShark runtime, resolver, and test binary notes are consolidated here from the 2026-05-19 snapshot.
2026-05-19 application notes
StutterShark.exe
What this program actually does
StutterShark.exe is the Platform Seat Service daemon on a GeForce NOW gameseat. It runs as Windows service StutterSharkService, hosts four in-process plugins, and monitors realtime stutter and deadzone for the active game session. It initializes NVML/NVAPI, subscribes to SSLM session lifecycle via MessageBus, fetches CSR config from GSConfigurator, publishes GPU perf counters, and emits telemetry on schema gfn-team.open.stuttershark:14.
Log banner in this snapshot: Platform Seat Service v0.13.10.
Architecture / control flow (recovered symbols)
main / ServiceHost (CServiceBase@systemservicebase@nv)
└─ PlatformSeatService::OnStart
├─ PlatformSeatService::InitializeTas / InitializeCsr
├─ PlatformSeatService::MbListenThread → MessageBus peer PlatformSeatService:StutterShark
├─ GSConfigClient → PssConfigData, SeatConfig
├─ SslmSubscriptionTracker / SslmObserver
├─ CPUID::Manager (NvpBridge channel)
└─ PlatformSeatService::LoadPlugins
├─ StutterSharkPlugin (ETW stutter detection, stack dumps)
├─ UmdPerfCounterPlugin (NVAPI/NVML GPU counters → Kratos)
├─ VcpuBoostControllerPlugin (vCPU clock boost via CPUID)
└─ GpuControllerPlugin (TGP/GPC capping, frame-time compositor)Plugin base: BasePlugin state machine (Uninitialized → Initializing → Initialized → Starting → Started → Stopping → Terminated).
Build tree: C:\builds\gfn-foundations\stuttershark\ (ServiceLib.cpp, plugin sources under Plugins\).
PDB: C:\builds\gfn-foundations\stuttershark\out\x64-windows-release\Service\StutterShark.pdb
RTTI / telemetry types (deep extract sample)
| Class / field type | Role |
|---|---|
BasePlugin, CServiceBase@systemservicebase@nv | Service + plugin framework |
GSConfigClient@gsprerequisites, Connector@tas@gs@gfn@nv | Config + TAS telemetry |
AppSensorMessage_*, AppServiceApi_SopsAppliedEvent | MessageBus session/SOPS events |
*@Fields@StutterSharkSchema | Telemetry fields (stutter counts, GPU cap stats, callstack sampling flags) |
BaseGpuController, GpuControllerSummarizedDataPoint | GPU controller plugin internals |
External interfaces
| Interface | Role |
|---|---|
Windows Service StutterSharkService | Installed via StutterShark.exe --install; auto-start + failure restart (sc failure) per install log |
| MessageBus | Peers PlatformSeatService:StutterShark, PlatformSeatService:StutterSharkTelemetry; config C:\asgard\services\gsp\MessageBus\x64\messagebus.conf (string) |
| GSConfigurator | Fetches PssConfigData, SeatConfig (Services=["StutterSharkService"]) |
SSLM (NGS:SSLM) | Subscribes for session state; waits for session-finished notification before tearing down bus |
| NVML / NVAPI | GPU enumeration, perf counters, controller policies |
| ETW / TDH / dbghelp | Stutter trace sessions, callstack capture |
| NvpBridge kernel driver | Installed via devcon + nvpbridge.inf; CPUID trusted channel |
| Perf counters | UmdPerfCounterPlugin.man, NvpBridge\nvpbridge.man via lodctr |
| Logs | logs/StutterShark/PlatformSeatService.log |
CLI strings (not service path): --stutter-min-threshold, --per-stutter-detail; description: "Realtime stutter and deadzone monitor and dumping service. CLI mode: Ctrl-C to kill".
Plugin lifecycle (strings + logs)
| Component | Evidence |
|---|---|
serviceLibRunPluginsInPrewarm | CSR Run Plugins in Prewarm true at 18:43:16 |
| StutterShark plugin CSR | Detection Disabled false, Detection Threshold 100 ms |
| VcpuBoostController CSR | Disabled false, ForceDefaultFreq true |
| Background callstack sampling | Disabled true |
| Dynamic GPU Cap | Disabled false, GPU Controller Prewarm Throttle GPU true |
| Session gate | BlockUntilFirstSessionEvent — waited 326000 ms for SOPS before starting plugins |
Session start (18:48:43–44): StutterShark, UmdPerfCounter, GpuController reach Started; VcpuBoostController early-stopped (Clock control feature support query failed).
Runtime timeline (from logs/StutterShark/PlatformSeatService.log)
| Time (local) | Event |
|---|---|
| 18:43:16.442 | Service v0.13.10; MessageBus join PlatformSeatService:StutterShark |
| 18:43:16.476–489 | NVML + NVAPI init; 1 GPU on vGPU (00000000:0c:00.0) |
| 18:43:16.512–534 | GSConfigurator configs fetched |
| 18:43:16.535 | CSR plugin configs applied |
| 18:43:16.585 | SSLM subscription cancelled (NGS not yet on bus) |
| 18:43:22.405 | SSLM subscribed after NGS:SSLM joined |
| 18:48:41.854 | SopsAppliedEvent: 1920×1080@60, cmsId [REDACTED_CMS_ID], instance [REDACTED_POOL] |
| 18:48:44.551 | StutterShark Service started; NvpBridge perf counters initialized |
| 18:48:58+ | Target process tracking (conhost.exe, seelen-ui.exe); repeated Empty stutter detect event passed in |
Failure modes (log + strings)
| String / log line | Meaning |
|---|---|
Plugin is hung, skipping state change | Plugin state transition timeout |
Timeout waiting for SSLM session finished notification | SSLM cleanup may be incomplete |
Empty stutter detect event passed in | Stutter detector received invalid event (observed repeatedly post-session) |
TGP limit setting failed / GPC clock setting failed | GpuController policy apply failed on vGPU seat |
Register Fan Cooler callback failed error NVAPI_TIMEOUT | UmdPerfCounter NVAPI callback registration failure |
CPUID Interface state control support query failed | CPUID channel teardown error |
Relationships
| Component | Interaction |
|---|---|
StutterSharkResolve.exe | Offline stack/symbol resolver for captured traces (bundled, not invoked in this session) |
StutterSharkTest.exe | Unit/integration tests for same plugin stack |
GSConfiguratorPlugin | Config authority for CSR/PSS |
Morph, GfnSdkService | Sibling seat services; all subscribe to SSLM after NGS joins |
SmithyController | Observes bus peers PlatformSeatService:StutterShark, StutterSharkTelemetry |
services/StutterShark/DLL/ | Ships dbghelp_new.dll, msdia140.dll, symsrv.dll, srcsrv.dll for symbol resolution |
Not verified
- Exact MessageBus protobuf types for
AppSensorMessagedispatch handlers. - Whether CLI mode is used on production seats (service path confirmed in logs).
- Full list of ETW providers enabled by
TraceSession. - Anti-cheat process dump feature (
--string mentions anti-cheat process name) — not observed in logs.
Evidence
readpe,strings, r2 onservices/StutterShark/StutterShark.exelogs/StutterShark/PlatformSeatService.loglogs/startup/stuttersharkSoftwareInstall.loglogs/GSP/GSConfiguratorPluginCurrent.log,logs/SmithyV2/SmithyController/.../SmithyControllerPlugin.log
StutterSharkResolve.exe
What this program actually does
StutterSharkResolve.exe is an offline post-processing CLI shipped with StutterShark. It resolves call stacks and symbols from stutter-capture artifacts produced by StutterSharkPlugin / TraceSession, using dbghelp (preferring bundled dbghelp_new.dll), DIA (msdia140.dll), and a custom StutterStackWalker. It emits CSV summaries (frames_data.csv, stutters_data.csv) from serialized trace payloads.
It is not a Windows service. Install log copies it beside StutterShark.exe; no runtime log references it in this snapshot.
Architecture / control flow (recovered symbols)
main (CLI11 App@CLI)
└─ StutterSharkResolve.cpp
├─ TraceSession / TraceConsumer
├─ StutterStackWalker (extends StackWalkerCustom)
│ ├─ StackWalkerInternal::LoadModuleWithPdbInfo
│ ├─ StackWalkerInternal::LoadPdbIntoDia
│ └─ StackWalkerCustom::ShowCallstack
└─ DeserializeImageAndStacks / DeserializeSystemWideStacks
→ CSV writers (frames_data.csv, stutters_data.csv)RTTI classes: StutterStackWalker, StackWalkerCustom, TraceConsumer, App@CLI.
Source paths (strings):
C:\builds\gfn-foundations\stuttershark\Service\StutterSharkResolve.cppC:\builds\gfn-foundations\stuttershark\Plugins\StutterSharkPlugin\TraceSession.cppC:\builds\gfn-foundations\stuttershark\Plugins\StutterSharkPlugin\StackWalker.cpp
PDB: C:\builds\gfn-foundations\stuttershark\out\x64-windows-release\Service\StutterSharkResolve.pdb
Symbol resolution stack (strings)
| Step | String evidence |
|---|---|
| Load dbghelp | ### Load SYSTEM32 dbghelp_new.dll, ## Load dbghelp.dll failed |
| SymInit | SymInit: Symbol-SearchPath: '%s', symOptions: %d |
| DIA path | Using DIA for module: {}, Base: {:#x}..., Loading PDB into DIA has failed |
| Stack walk | StackWalk64, StackWalk64-Endless-Callstack! |
| Undecorate | UnDecorateSymbolName, `<unresolved symbol>` |
| Env | _NT_SYMBOL_PATH |
Output artifacts:
callstack_folded_process_*,callstack_folded_frame_*(folded stack text)frames_data.csv— columns includeTimestampUTC,FrameIndex,TimestampSecond,DurationMs,SystemCpuUsage,WorkloadCpuUsagestutters_data.csv— includes file I/O stats columns (FileTotalRead,FileP95Read, …)
External interfaces
| Interface | Role |
|---|---|
| CLI | Usage string present; CLI11 help/error types in RTTI |
| Local DLLs | Expects dbghelp_new.dll, DIA stack under services/StutterShark/DLL/ |
| Input | Serialized image/stack blobs from trace session ([{}] processes captured for system-wide callstacks) |
| Output | CSV files in working directory (inferred from string filenames) |
No MessageBus, SCM, or network surface in imports.
PE / imports (readpe + r2)
| Property | Value |
|---|---|
| Size | 1,356,288 bytes |
| Arch | PE32+ x64 console |
| Compile | 2026-04-22 02:36:25 UTC |
| Linker | MSVC 14.35 |
| Imports | KERNEL32 (thread/debug APIs: OpenThread, SuspendThread, GetThreadContext, ReadProcessMemory), pdh.dll, ADVAPI32 (GetUserNameA), ole32, OLEAUT32 (DIA/COM) |
Relationships
| Component | Interaction |
|---|---|
StutterShark.exe | Produces trace/callstack capture data consumed by this tool |
StutterShark/DLL/dbghelp_new.dll | Preferred dbghelp implementation |
StutterShark/DLL/msdia140.dll | PDB load via DIA |
StutterShark/DLL/symsrv.dll, srcsrv.dll | Symbol server/source indexing (bundled; usage inferred from deployment) |
Not verified
- Exact CLI flags and required input file layout (only
Usagestring recovered). - Whether seat automation invokes this binary post-session or only engineers run it manually.
- Whether
pdh.dllimport is used on all code paths or dead import from shared build.
Evidence
readpe,strings, r2 onservices/StutterShark/StutterSharkResolve.exelogs/startup/stuttersharkSoftwareInstall.log(binary deployed)- Shared plugin strings in
StutterShark.exe(StutterStackWalker::*, CSV column names)
StutterSharkTest.exe
What this program actually does
StutterSharkTest.exe is the automated test harness for the StutterShark / Platform Seat Service codebase. It links the production plugin implementations (StutterSharkPlugin, GpuControllerPlugin, VcpuBoostControllerPlugin, UmdPerfCounterPlugin) with Google Test / Google Mock and exercises service startup, CSR parsing, detection logic, GPU controllers, CPUID channel, MessageBus helpers, and CLI config clients.
It is not deployed as a seat service and produces no logs in this snapshot.
Test modules (source path strings)
| Source file | Focus |
|---|---|
Tests/TestPlatformSeatService.cpp | PlatformSeatService GameSeat mode happy-path start/stop, CLI mode happy-path start/stop |
Tests/TestDetection.cpp | Stutter detection |
Tests/TestGpuController.cpp | GpuControllerPluginImpl compaction, SOPS, frame-time CSV dump |
Tests/TestVcpuBoostController.cpp | vCPU boost controller |
Tests/TestCPUIDChannel.cpp | CPUID channel / TestPlugin1/2/3 registration |
Tests/TestCsrParsingHelper.cpp | CSR config parsing |
Tests/TestPubSub.cpp | Pub/sub messaging |
Tests/TestRollingWindowStrategy.cpp | Rolling window strategy |
Tests/TestFrameWindow.cpp | Frame window utilities |
Tests/TestFrameDataCompositor.cpp | Frame data compositor |
Tests/TestMbHelper.cpp | MessageBus helper |
Tests/CliMode/TestJsonGSConfigClient.cpp | CLI JSON GSConfig client |
Tests/Mocks.h | BaseGpuController@TestGpuController@Mocks, MockMessageBus, MockBusMessage |
Framework strings: gtest/gtest-matchers.h, gmock/gmock-spec-builders.h, gmock/gmock-actions.h, Catch/Clara types also present in RTTI (mixed test deps in binary).
PDB: C:\builds\gfn-foundations\stuttershark\out\x64-windows-release\Tests\StutterSharkTest.pdb
RTTI / types (deep extract sample)
| Class | Role |
|---|---|
TestPlatformSeatService | End-to-end service tests |
BaseGpuController@TestGpuController@Mocks | Mock GPU controller |
MockMessageBus, MockBusMessage | Bus isolation |
*@Fields@StutterSharkSchema | Same telemetry schema types as production EXE |
AppCpuStarvingStuttersCount/Pct@Fields@StutterSharkSchema | Stutter metric field tests |
Production plugin class names in strings: StutterSharkPlugin, GpuControllerPlugin, VcpuBoostControllerPlugin.
Assertions recovered (strings)
Examples embedded as test expectations:
service.mEnabledPlugins.size() == 0→== 3after plugin loadplugin->getState() == PluginState::STARTEDplugin->mPluginErrored == true/falsewithmLastErrorMessagesubstring checks for NVML/NVAPI init failuresGpuControllerPluginImpl - DumpFrametimesToCsv - With Data(and Disabled/Empty/Invalid Directory variants)
PE / imports (readpe + r2)
| Property | Value |
|---|---|
| Size | 6,737,920 bytes (largest StutterShark binary — includes gtest/gmock + plugins) |
| Arch | PE32+ x64 console |
| Compile | 2026-04-22 02:36:57 UTC |
| Entry | 0x140427238; main @ 0x14045bb90 |
| Key imports | Same monitoring stack as StutterShark.exe: ETW (ADVAPI32), nvml.dll, pdh.dll, dbghelp.dll, tdh.dll, plus PssCaptureSnapshot / PssQuerySnapshot / PssWalkSnapshot for process snapshot tests |
Relationships
| Component | Interaction |
|---|---|
StutterShark.exe | Tests the same PlatformSeatService + plugin code paths |
StutterSharkResolve.exe | Shares TraceSession / stack types; no direct test reference in strings |
| Build tree | C:\builds\gfn-foundations\stuttershark\Tests\ |
Not verified
- Test runner CLI flags (filter/suite selection).
- CI invocation path (not referenced in Asgard seat logs).
- Code coverage of
StutterSharkResolve.exe(no strings linking resolve tool tests).
Evidence
readpe,strings, r2 onservices/StutterShark/StutterSharkTest.exelogs/startup/stuttersharkSoftwareInstall.log(binary deployed to seat)- Parity strings with
StutterShark.exeplugin implementations