Identify a process instance by a deterministic identity returned from the agent (per-OS, with a Process.mainModule + pid fallback) and stash it on ProcessSession.processInfo. Rekey memory_page into memory_page_module (module UUID + offset) so cached bytes survive ASLR, and memory_page_anon (process identity + address) for JIT / heap regions that only survive within one process instance. Purge stale anon pages on every fresh attach. Add updateProcessInfo, updateModuleAnalysis and updateInsight SessionOps plus a side-channel publish-memory-page op and a +fetch-memory-page request. The driver write-throughs every page it fetches; non-drivers pull on miss and persist locally. Module-analysis rows flow the same way so non-drivers can key their cache by module UUID. The lab-join snapshot now carries processInfo and module_analyses too. Refresh actions on the insight detail view: Reread Bytes drops the pages overlapping the visible range; Reanalyze Module drops the module's analysis and pages, re-running r2 on next access. The macOS detail view now reads the insight live from insightsBySession via observation; GTK forwards .insightUpdated into the detail and reschedules a refresh when the resolved address changes.
18 lines
590 B
Swift
18 lines
590 B
Swift
import Foundation
|
|
|
|
public enum SessionListChange: Sendable {
|
|
case sessionAdded(ProcessSession)
|
|
case sessionUpdated(ProcessSession)
|
|
case sessionRemoved(UUID)
|
|
case instrumentAdded(InstrumentInstance)
|
|
case instrumentUpdated(InstrumentInstance)
|
|
case instrumentRemoved(id: UUID, sessionID: UUID)
|
|
case insightAdded(AddressInsight)
|
|
case insightUpdated(AddressInsight)
|
|
case insightRemoved(id: UUID, sessionID: UUID)
|
|
case traceUpdated(ITrace)
|
|
case traceRemoved(id: UUID, sessionID: UUID)
|
|
case descriptorsChanged
|
|
case customInstrumentDefsChanged
|
|
}
|