diff options
author | 2020-02-06 19:02:33 -0500 | |
---|---|---|
committer | 2022-03-29 12:01:34 +0200 | |
commit | fa85bb4fb05caf4f1fb35aef3a6f0de6083b9722 (patch) | |
tree | a4e64acc13435ef25765c99955337e7f7a9e9e0c | |
parent | b08be09c0da5ab6a68cc6079bd35d895ba2f8b99 (diff) | |
download | libimobiledevice-fa85bb4fb05caf4f1fb35aef3a6f0de6083b9722.tar.gz libimobiledevice-fa85bb4fb05caf4f1fb35aef3a6f0de6083b9722.tar.bz2 |
implement as documented
-rw-r--r-- | tools/idevicedebug.c | 35 |
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 | ||