Skip to content

Commit 969b992

Browse files
committed
Handle qThreadStopInfo, run up to breakpoint in handler
1 parent 4e8b062 commit 969b992

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

Sources/GDBRemoteProtocol/GDBHostCommand.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ package struct GDBHostCommand: Equatable {
3838
case readMemoryBinaryData
3939
case readMemory
4040
case wasmCallStack
41+
case threadStopInfo
4142

4243
case generalRegisters
4344

@@ -97,6 +98,7 @@ package struct GDBHostCommand: Equatable {
9798
/// - arguments: raw arguments that immediately follow kind of the command.
9899
package init(kindString: String, arguments: String) throws(GDBHostCommandDecoder.Error) {
99100
let registerInfoPrefix = "qRegisterInfo"
101+
let threadStopInfoPrefix = "qThreadStopInfo"
100102

101103
if kindString.starts(with: "x") {
102104
self.kind = .readMemoryBinaryData
@@ -109,6 +111,14 @@ package struct GDBHostCommand: Equatable {
109111
} else if kindString.starts(with: registerInfoPrefix) {
110112
self.kind = .registerInfo
111113

114+
guard arguments.isEmpty else {
115+
throw GDBHostCommandDecoder.Error.unexpectedArgumentsValue
116+
}
117+
self.arguments = String(kindString.dropFirst(registerInfoPrefix.count))
118+
return
119+
} else if kindString.starts(with: threadStopInfoPrefix) {
120+
self.kind = .threadStopInfo
121+
112122
guard arguments.isEmpty else {
113123
throw GDBHostCommandDecoder.Error.unexpectedArgumentsValue
114124
}

Sources/GDBRemoteProtocol/GDBTargetResponseEncoder.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import Foundation
14+
import Logging
1415
import NIOCore
1516

1617
extension String {
@@ -27,7 +28,12 @@ extension String {
2728
package class GDBTargetResponseEncoder: MessageToByteEncoder {
2829
private var isNoAckModeActive = false
2930

30-
package init() {}
31+
private let logger: Logger
32+
33+
package init(logger: Logger) {
34+
self.logger = logger
35+
}
36+
3137
package func encode(data: GDBTargetResponse, out: inout ByteBuffer) {
3238
if !isNoAckModeActive {
3339
out.writeInteger(UInt8(ascii: "+"))
@@ -51,8 +57,9 @@ package class GDBTargetResponseEncoder: MessageToByteEncoder {
5157
out.writeString(str.appendedChecksum)
5258

5359
case .hexEncodedBinary(let binary):
54-
let hexDump = ByteBuffer(bytes: binary).hexDump(format: .compact)
55-
out.writeString(hexDump.appendedChecksum)
60+
let hexDumpResponse = ByteBuffer(bytes: binary).hexDump(format: .compact).appendedChecksum
61+
self.logger.trace("GDBTargetResponseEncoder encoded a response", metadata: ["RawResponse": .string(hexDumpResponse)])
62+
out.writeString(hexDumpResponse)
5663

5764
case .empty:
5865
out.writeString("".appendedChecksum)

Sources/WasmKitGDBHandler/WasmKitGDBHandler.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
enum Error: Swift.Error {
3939
case unknownTransferArguments
4040
case unknownReadMemoryArguments
41+
case stoppingAtEntrypointFailed
4142
}
4243

4344
private let wasmBinary: ByteBuffer
@@ -63,6 +64,9 @@
6364

6465
self.debugger = try Debugger(module: parseWasm(bytes: .init(buffer: self.wasmBinary)), store: store, imports: imports)
6566
try self.debugger.stopAtEntrypoint()
67+
guard try self.debugger.run() == nil else {
68+
throw Error.stoppingAtEntrypointFailed
69+
}
6670
}
6771

6872
package func handle(command: GDBHostCommand) throws -> GDBTargetResponse {
@@ -114,7 +118,7 @@
114118
case .subsequentThreadInfo:
115119
responseKind = .string("l")
116120

117-
case .targetStatus:
121+
case .targetStatus, .threadStopInfo:
118122
responseKind = .keyValuePairs([
119123
"T05thread": "1",
120124
"reason": "trace",

0 commit comments

Comments
 (0)