summaryrefslogtreecommitdiffstats
path: root/tools/idevicedebug.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/idevicedebug.c')
-rw-r--r--tools/idevicedebug.c35
1 files changed, 18 insertions, 17 deletions
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 @@ static debugserver_error_t debugserver_client_handle_response(debugserver_client
115 char* o = NULL; 115 char* o = NULL;
116 char* r = *response; 116 char* r = *response;
117 117
118 /* Documentation of response codes can be found here:
119 https://github.com/llvm/llvm-project/blob/4fe839ef3a51e0ea2e72ea2f8e209790489407a2/lldb/docs/lldb-gdb-remote.txt#L1269 */
120
118 if (r[0] == 'O') { 121 if (r[0] == 'O') {
119 /* stdout/stderr */ 122 /* stdout/stderr */
120 debugserver_decode_string(r + 1, strlen(r) - 1, &o); 123 debugserver_decode_string(r + 1, strlen(r) - 1, &o);
@@ -148,22 +151,8 @@ static debugserver_error_t debugserver_client_handle_response(debugserver_client
148 return dres; 151 return dres;
149 152
150 dres = DEBUGSERVER_E_UNKNOWN_ERROR; 153 dres = DEBUGSERVER_E_UNKNOWN_ERROR;
151 } else if (r[0] == 'E' || r[0] == 'W') { 154 } else if (r[0] == 'E') {
152 /* dogben: 'W' + hex-encoded byte seems to mean "process exited with this status." */ 155 printf("ERROR: %s\n", r + 1);
153 if (r[0] == 'W' && strlen(r) == 3 && exit_status != NULL) {
154 debugserver_decode_string(r + 1, strlen(r) - 1, &o);
155 if (o != NULL) {
156 printf("Exit status: %u\n", o[0]);
157 *exit_status = o[0];
158 free(o);
159 o = NULL;
160 free(*response);
161 *response = NULL;
162 return dres;
163 }
164 }
165
166 printf("%s: %s\n", (r[0] == 'E' ? "ERROR": "WARNING") , r + 1);
167 156
168 free(*response); 157 free(*response);
169 *response = NULL; 158 *response = NULL;
@@ -177,6 +166,18 @@ static debugserver_error_t debugserver_client_handle_response(debugserver_client
177 log_debug("result: %d", dres); 166 log_debug("result: %d", dres);
178 debugserver_command_free(command); 167 debugserver_command_free(command);
179 command = NULL; 168 command = NULL;
169 } else if (r[0] == 'W' || r[0] == 'X') {
170 /* process exited */
171 debugserver_decode_string(r + 1, strlen(r) - 1, &o);
172 if (o != NULL) {
173 printf("Exit %s: %u\n", (r[0] == 'W' ? "status" : "due to signal"), o[0]);
174 *exit_status = o[0] + (r[0] == 'W' ? 0 : 128);
175 free(o);
176 o = NULL;
177 }
178 free(*response);
179 *response = NULL;
180 return dres;
180 } else if (r && strlen(r) == 0) { 181 } else if (r && strlen(r) == 0) {
181 if (!send_reply) 182 if (!send_reply)
182 return dres; 183 return dres;
@@ -520,7 +521,7 @@ int main(int argc, char *argv[])
520 dres = debugserver_client_handle_response(debugserver_client, &response, 1, &exit_status); 521 dres = debugserver_client_handle_response(debugserver_client, &response, 1, &exit_status);
521 } 522 }
522 } 523 }
523 if (exit_status > 0) { 524 if (exit_status >= 0) {
524 goto cleanup; 525 goto cleanup;
525 } 526 }
526 527