From c919ca5be08e5bc6febe10aeaa0d583bd7a06153 Mon Sep 17 00:00:00 2001 From: Ben Cheng Date: Thu, 28 Jan 2010 11:52:11 -0800 Subject: [PATCH] Add a poor-man's disassembler to inspect crashes in JIT'ed code. --- tools/gdbjithelper/Android.mk | 24 +++++++++++ tools/gdbjithelper/README.txt | 66 ++++++++++++++++++++++++++++++ tools/gdbjithelper/gdbjithelper.c | 86 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 tools/gdbjithelper/Android.mk create mode 100644 tools/gdbjithelper/README.txt create mode 100644 tools/gdbjithelper/gdbjithelper.c diff --git a/tools/gdbjithelper/Android.mk b/tools/gdbjithelper/Android.mk new file mode 100644 index 000000000..e551b656a --- /dev/null +++ b/tools/gdbjithelper/Android.mk @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := gdbjithelper.c +LOCAL_CFLAGS += -O0 -g +LOCAL_MODULE := gdbjithelper +LOCAL_MODULE_TAGS := eng +include $(BUILD_EXECUTABLE) diff --git a/tools/gdbjithelper/README.txt b/tools/gdbjithelper/README.txt new file mode 100644 index 000000000..032b24471 --- /dev/null +++ b/tools/gdbjithelper/README.txt @@ -0,0 +1,66 @@ +Step 1 + +If you see a native crash in the bugreport and the PC/LR are pointing to the +code cache address range*, copy them into codePC and codeLR in gdbjithelper.c, +respectively. + +*Caveats: debuggerd doesn't know the range of code cache. So apply this tool if +the crashing address is not contained by any shared library. + + #00 pc 463ba204 + #01 lr 463ba1c9 + +code around pc: +463ba1e4 4300e119 4284aa7a f927f7b7 40112268 +463ba1f4 419da7f8 00002000 01000100 00080000 +463ba204 4191debc 01010000 4284aa74 68b00054 +463ba214 045cf205 cc016468 0718f2a5 d0102800 +463ba224 4c13c701 a20aa108 efb0f775 e008e010 + +code around lr: +463ba1a8 42e19e58 f2050050 cc01045c 0718f2a5 +463ba1b8 d00f2800 4c13c701 a20aa108 efe4f775 +463ba1c8 e007e010 29006bf8 6e77dc01 a10347b8 +463ba1d8 ef60f775 6db1480b 1c2d4788 4300e119 +463ba1e8 4284aa7a f927f7b7 40112268 419da7f8 + + +Step 2 + +Push $OUT/EXECUTABLES/gdbjithelper_intermediates/LINKED/gdbjithelper to +/system/bin on the device or emulator + + +Step 3 + +Debug the executable as usual: + +adb forward tcp:5039 tcp:5039 +adb shell gdbserver :5039 /system/bin/gdbjithelper & +arm-eabi-gdb $OUT/symbols/system/bin/gdbjithelper +(gdb) tar r :5039 +Remote debugging using :5039 +Remote debugging from host 127.0.0.1 +gdb: Unable to get location for thread creation breakpoint: requested event is not supported +__dl__start () at bionic/linker/arch/arm/begin.S:35 +35 mov r0, sp +gdb: Unable to get location for thread creation breakpoint: requested event is not supported +Current language: auto; currently asm +(gdb) c +Continuing. +[New Thread 596] +codePC[0]: 0x4300e119 +codePC[1]: 0x4284aa7a + : + + +Step 4 + +Hit ctrl-C + +Issue the following command to see code around PC +x /20i (char *) &codePC+1 + +Issue the following command to see code around LR +x /20i (char *) &codeLR+1 + diff --git a/tools/gdbjithelper/gdbjithelper.c b/tools/gdbjithelper/gdbjithelper.c new file mode 100644 index 000000000..d0f9ce385 --- /dev/null +++ b/tools/gdbjithelper/gdbjithelper.c @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +volatile int done; + +/* + * See README.txt for detailed steps. + * + * If you see a native crash in the bugreport and the PC/LR are + * pointing to the code cache address range, copy them into the following + * arrays. + * + * #00 pc 463ba204 + * #01 lr 463ba1c9 + * + * code around pc: + * 463ba1e4 4300e119 4284aa7a f927f7b7 40112268 + * 463ba1f4 419da7f8 00002000 01000100 00080000 + * 463ba204 4191debc 01010000 4284aa74 68b00054 + * 463ba214 045cf205 cc016468 0718f2a5 d0102800 + * 463ba224 4c13c701 a20aa108 efb0f775 e008e010 + * + * code around lr: + * 463ba1a8 42e19e58 f2050050 cc01045c 0718f2a5 + * 463ba1b8 d00f2800 4c13c701 a20aa108 efe4f775 + * 463ba1c8 e007e010 29006bf8 6e77dc01 a10347b8 + * 463ba1d8 ef60f775 6db1480b 1c2d4788 4300e119 + * 463ba1e8 4284aa7a f927f7b7 40112268 419da7f8 + * + */ + +int codePC[] = { + // Sample content + 0x4300e119, 0x4284aa7a, 0xf927f7b7, 0x40112268, + 0x419da7f8, 0x00002000, 0x01000100, 0x00080000, + 0x4191debc, 0x01010000, 0x4284aa74, 0x68b00054, + 0x045cf205, 0xcc016468, 0x0718f2a5, 0xd0102800, + 0x4c13c701, 0xa20aa108, 0xefb0f775, 0xe008e010, +}; + +int codeLR[] = { + // Sample content + 0x42e19e58, 0xf2050050, 0xcc01045c, 0x0718f2a5, + 0xd00f2800, 0x4c13c701, 0xa20aa108, 0xefe4f775, + 0xe007e010, 0x29006bf8, 0x6e77dc01, 0xa10347b8, + 0xef60f775, 0x6db1480b, 0x1c2d4788, 0x4300e119, + 0x4284aa7a, 0xf927f7b7, 0x40112268, 0x419da7f8, +}; + +void dumpCode() +{ + unsigned int i; + + for (i = 0; i < sizeof(codePC)/sizeof(int); i++) { + printf("codePC[%d]: %#x\n", i, codePC[i]); + } + + for (i = 0; i < sizeof(codeLR)/sizeof(int); i++) { + printf("codeLR[%d]: %#x\n", i, codeLR[i]); + } +} + +int main() +{ + dumpCode(); + while (!done) { + sleep(1000); + } + return 0; +} -- 2.11.0