implement as documented
diff --git a/tools/idevicedebug.c b/tools/idevicedebug.c
index 24cc46d..a5559e1 100644
--- a/tools/idevicedebug.c
+++ b/tools/idevicedebug.c
@@ -115,6 +115,9 @@
 	char* o = NULL;
 	char* r = *response;
 
+        /* Documentation of response codes can be found here:
+           https://github.com/llvm/llvm-project/blob/4fe839ef3a51e0ea2e72ea2f8e209790489407a2/lldb/docs/lldb-gdb-remote.txt#L1269 */
+        
 	if (r[0] == 'O') {
 		/* stdout/stderr */
 		debugserver_decode_string(r + 1, strlen(r) - 1, &o);
@@ -148,22 +151,8 @@
 			return dres;
 
 		dres = DEBUGSERVER_E_UNKNOWN_ERROR;
-	} else if (r[0] == 'E' || r[0] == 'W') {
-		/* dogben: 'W' + hex-encoded byte seems to mean "process exited with this status." */
-		if (r[0] == 'W' && strlen(r) == 3 && exit_status != NULL) {
-			debugserver_decode_string(r + 1, strlen(r) - 1, &o);
-			if (o != NULL) {
-				printf("Exit status: %u\n", o[0]);
-				*exit_status = o[0];
-				free(o);
-				o = NULL;
-				free(*response);
-				*response = NULL;
-				return dres;
-			}
-		}
-
-		printf("%s: %s\n", (r[0] == 'E' ? "ERROR": "WARNING") , r + 1);
+	} else if (r[0] == 'E') {
+		printf("ERROR: %s\n", r + 1);
 
 		free(*response);
 		*response = NULL;
@@ -177,6 +166,18 @@
 		log_debug("result: %d", dres);
 		debugserver_command_free(command);
 		command = NULL;
+	} else if (r[0] == 'W' || r[0] == 'X') {
+		/* process exited */
+		debugserver_decode_string(r + 1, strlen(r) - 1, &o);
+		if (o != NULL) {
+			printf("Exit %s: %u\n", (r[0] == 'W' ? "status" : "due to signal"), o[0]);
+			*exit_status = o[0] + (r[0] == 'W' ? 0 : 128);
+			free(o);
+			o = NULL;
+		}
+		free(*response);
+		*response = NULL;
+		return dres;
 	} else if (r && strlen(r) == 0) {
 		if (!send_reply)
 			return dres;
@@ -520,7 +521,7 @@
 						dres = debugserver_client_handle_response(debugserver_client, &response, 1, &exit_status);
 					}
 				}
-				if (exit_status > 0) {
+				if (exit_status >= 0) {
 					goto cleanup;
 				}