From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3030 invoked by alias); 17 Jul 2009 07:27:33 -0000 Received: (qmail 3017 invoked by uid 22791); 17 Jul 2009 07:27:30 -0000 X-SWARE-Spam-Status: No, hits=-1.1 required=5.0 tests=AWL,BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org Received: from rv-out-0708.google.com (HELO rv-out-0708.google.com) (209.85.198.247) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 17 Jul 2009 07:27:18 +0000 Received: by rv-out-0708.google.com with SMTP id f25so96075rvb.0 for ; Fri, 17 Jul 2009 00:27:16 -0700 (PDT) Received: by 10.140.157.4 with SMTP id f4mr546387rve.158.1247815636011; Fri, 17 Jul 2009 00:27:16 -0700 (PDT) Received: from bibi.branda.to (61-30-10-70.static.tfn.net.tw [61.30.10.70]) by mx.google.com with ESMTPS id k41sm4571014rvb.7.2009.07.17.00.27.07 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 17 Jul 2009 00:27:14 -0700 (PDT) Received: from bibi.branda.to (localhost [127.0.0.1]) by bibi.branda.to (8.14.3/8.14.3) with ESMTP id n6H7Renn006469 for ; Fri, 17 Jul 2009 15:27:50 +0800 (CST) (envelope-from thinker@localhost.my.domain) Received: (from thinker@localhost) by bibi.branda.to (8.14.3/8.14.3/Submit) id n6H7RdeT006466; Fri, 17 Jul 2009 15:27:39 +0800 (CST) (envelope-from thinker) From: Thinker Li MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Message-ID: <19040.10219.795497.405766@bibi.branda.to> Date: Fri, 17 Jul 2009 08:47:00 -0000 To: gdb-patches@sourceware.org Subject: Fwd: Get backtrace at PLT and stepi into PLT In-Reply-To: References: <19038.65134.58926.218902@bibi.branda.to> <20090716113730.GA8646@caradoc.them.org> <19040.7376.886250.727782@bibi.branda.to> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-07/txt/msg00420.txt.bz2 Daniel Jacobowitz writes:  > On Thu, Jul 16, 2009 at 06:18:22PM +0800, User Thinker wrote:  > > Hi all,  > >  > > I have a patch that makes GDB can properly stepi into PLT for ARM Thumb  > > instruction.  The patch also allow GDB to perform backtrace at PLT.  >  > What version of GDB are these patches against?  Have you tried the  > version from CVS?  This should work perfectly. I tried it with GDB 6.8.  I had just tried the version from CVS this morning. It can stepi into PLT, but backtrace is still not work. I did some tests for GDB. I configured GDB with command         configure --build=x86_64-unknown-linux-gnu \                 --host=x86_64-unknown-linux-gnu \                 --target=arm-eabi-linux --disable-werror for 6.8, CVS, 6.8 with the patch version, and CVS with the patch version. I did a test for each version.  All these tests are following the same commands, basically.  1. I set a breakpoint at 0xa78c5424  2. issue 3 stepi commands after inferior being stopped for the breakpoint.  3. I also issue backtrace commands if it steps into PLT, successfully. Logs for tests are at end of the email.  >  > > It means GDB should put a invalid instruction of Thumb version at  > > base address of the trampoline.  But, it actually puts  > > ARM version one.  I have checked GDB source code for this issue.  > > GDB check flags in symbol that contain memory space that breakpoint  > > was setted at.  If the symbol is flaged as Thumb, it uses  > > Thumb version invalid instruction code, or it would use  > > ARM version.  It is reasonable.  But, the trampoline in PLT contains  > > both types of instructions.  And, the result of checking is  > > the block where the trampoline is in is not Thumb.  >  > The CVS version of GDB checks ABI-defined mapping symbols ($a, $t).  > These also allow disassembly to work correctly. Cool! It works for me.  >  > > If you try to backtrace stack when GDB stop at PLT, you would  > > get nothing.  It is because no any unwinder can handle code in PLT.  >  > arm_stub_unwinder_sniffer is supposed to handle this case.  It's been  > there since 2005, and I've used it successfully.  What's going wrong  > with that? I can not even found arm_stub_unwinder_sniffer in the source tree of GDB.  So, where is arm_stub_unwinder_sniffer? Is it part of GDB, officially?  >  > > begin 644 arm-plt.diff.gz  > > M'XL(`#OJ7DH``YU7;4_;2!#^C'_%E)-Z`3O43D*20JDH$"A5"%62ZGKWQ?++  >  > Please include patches as text.  See the list archives for examples.  > Thanks. -------------------- patch for 6.8 -------------------- diff -r 3a752b09834a gdb/arm-linux-tdep.c --- a/gdb/arm-linux-tdep.c      Mon Jul 06 14:17:22 2009 +0800 +++ b/gdb/arm-linux-tdep.c      Fri Jul 17 10:32:20 2009 +0800 @@ -316,6 +316,21 @@ arm_linux_rt_sigreturn_init (const struc                               + ARM_SIGCONTEXT_R0);  } +static void +arm_linux_plt_init (const struct tramp_frame *self, +                   struct frame_info *next_frame, +                   struct trad_frame_cache *this_cache, +                   CORE_ADDR func) +{ +  CORE_ADDR sp = frame_unwind_register_unsigned (next_frame, ARM_SP_REGNUM); +  CORE_ADDR fake_sp = sp - 4; +  CORE_ADDR lr = frame_unwind_register_unsigned(next_frame, ARM_LR_REGNUM); +   +  write_memory_unsigned_integer(fake_sp, 4, lr); +  trad_frame_set_reg_addr(this_cache, ARM_PC_REGNUM, fake_sp); +  trad_frame_set_id (this_cache, frame_id_build (sp, func)); +} +  static struct tramp_frame arm_linux_sigreturn_tramp_frame = {    SIGTRAMP_FRAME,    4, @@ -358,6 +373,23 @@ static struct tramp_frame arm_eabi_linux    arm_linux_rt_sigreturn_init  }; +#define ARM_THUMB_BX_PC_INSN 0x00004778 +#define ARM_PLT_ADD_PC_INSN 0xe28fc600 +#define ARM_PLT_ADD_R12_INSN 0xe28cc000 +#define ARM_PLT_LDR_INSN 0xe5bcf000 +static struct tramp_frame arm_eabi_linux_plt_tramp_frame = { +  GHOST_FRAME, +  4, +  { +    { ARM_THUMB_BX_PC_INSN, 0x0000ffff }, +    { ARM_PLT_ADD_PC_INSN, -1 }, +    { ARM_PLT_ADD_R12_INSN, 0xfffff000 }, +    { ARM_PLT_LDR_INSN, 0xfffff000 }, +    { TRAMP_SENTINEL_INSN } +  }, +  arm_linux_plt_init +}; +  /* Core file and register set support.  */  #define ARM_LINUX_SIZEOF_GREGSET (18 * INT_REGISTER_SIZE) @@ -643,6 +675,8 @@ arm_linux_init_abi (struct gdbarch_info                                 &arm_eabi_linux_sigreturn_tramp_frame);    tramp_frame_prepend_unwinder (gdbarch,                                 &arm_eabi_linux_rt_sigreturn_tramp_frame); +  tramp_frame_prepend_unwinder (gdbarch, +                               &arm_eabi_linux_plt_tramp_frame);    /* Core file support.  */    set_gdbarch_regset_from_core_section (gdbarch, diff -r 3a752b09834a gdb/arm-tdep.c --- a/gdb/arm-tdep.c    Mon Jul 06 14:17:22 2009 +0800 +++ b/gdb/arm-tdep.c    Fri Jul 17 10:32:20 2009 +0800 @@ -1677,9 +1677,12 @@ thumb_get_next_pc (struct frame_info *fr        unsigned short inst2 = read_memory_unsigned_integer (pc + 2, 2);        offset = (sbits (inst1, 0, 10) << 12) + (bits (inst2, 0, 10) << 1);        nextpc = pc_val + offset; -      /* For BLX make sure to clear the low bits.  */ +      /* For BLX make sure to clear the low bits, but keep LSB setted.  */        if (bits (inst2, 11, 12) == 1) -       nextpc = nextpc & 0xfffffffc; +       nextpc = (nextpc & 0xfffffffc); +      else +       nextpc = nextpc | 1;    /* It would be fail to break on PLT without +                                * this.  */      }    else if ((inst1 & 0xff00) == 0x4700)     /* bx REG, blx REG */      { diff -r 3a752b09834a gdb/frame.c --- a/gdb/frame.c       Mon Jul 06 14:17:22 2009 +0800 +++ b/gdb/frame.c       Fri Jul 17 10:32:20 2009 +0800 @@ -1458,7 +1458,8 @@ get_prev_frame (struct frame_info *this_       stop at main, we should at least stop at the entry point of the       application.  */    if (!backtrace_past_entry -      && get_frame_type (this_frame) != DUMMY_FRAME && this_frame- >level >= 0 +      && get_frame_type (this_frame) != DUMMY_FRAME +      && get_frame_type (this_frame) != GHOST_FRAME && this_frame- >level >= 0        && inside_entry_func (this_frame))      {        frame_debug_got_null_frame (gdb_stdlog, this_frame, "inside entry func"); diff -r 3a752b09834a gdb/frame.h --- a/gdb/frame.h       Mon Jul 06 14:17:22 2009 +0800 +++ b/gdb/frame.h       Fri Jul 17 10:32:20 2009 +0800 @@ -199,7 +199,10 @@ enum frame_type    SIGTRAMP_FRAME,    /* Sentinel or registers frame.  This frame obtains register values       direct from the inferior's registers.  */ -  SENTINEL_FRAME +  SENTINEL_FRAME, +  /* This type of frame is not existed in the stack of inferior. +     It can be used for frames that similar to sentinel frame.  */ +  GHOST_FRAME  };  /* For every stopped thread, GDB tracks two frames: current and -------------------------------------------------- -------------------- patch for CVS -------------------- diff -r 92c4c442a2c6 gdb/arm-linux-tdep.c --- a/gdb/arm-linux-tdep.c      Fri Jul 17 09:43:11 2009 +0800 +++ b/gdb/arm-linux-tdep.c      Fri Jul 17 14:17:34 2009 +0800 @@ -321,6 +321,23 @@ arm_linux_rt_sigreturn_init (const struc                               + ARM_SIGCONTEXT_R0);  } +static void +arm_linux_plt_init (const struct tramp_frame *self, +                   struct frame_info *this_frame, +                   struct trad_frame_cache *this_cache, +                   CORE_ADDR func) +{ +  CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM); +  CORE_ADDR fake_sp = sp - 4; +  CORE_ADDR lr = get_frame_register_unsigned(this_frame, ARM_LR_REGNUM); +  struct gdbarch *gdbarch = get_frame_arch(this_frame); +  enum bfd_endian byte_order = gdbarch_byte_order(gdbarch); +   +  write_memory_unsigned_integer(fake_sp, 4, byte_order, lr); +  trad_frame_set_reg_addr(this_cache, ARM_PC_REGNUM, fake_sp); +  trad_frame_set_id (this_cache, frame_id_build (sp, func)); +} +  static struct tramp_frame arm_linux_sigreturn_tramp_frame = {    SIGTRAMP_FRAME,    4, @@ -363,6 +380,23 @@ static struct tramp_frame arm_eabi_linux    arm_linux_rt_sigreturn_init  }; +#define ARM_THUMB_BX_PC_INSN 0x00004778 +#define ARM_PLT_ADD_PC_INSN 0xe28fc600 +#define ARM_PLT_ADD_R12_INSN 0xe28cc000 +#define ARM_PLT_LDR_INSN 0xe5bcf000 +static struct tramp_frame arm_eabi_linux_plt_tramp_frame = { +  GHOST_FRAME, +  4, +  { +    { ARM_THUMB_BX_PC_INSN, 0x0000ffff }, +    { ARM_PLT_ADD_PC_INSN, -1 }, +    { ARM_PLT_ADD_R12_INSN, 0xfffff000 }, +    { ARM_PLT_LDR_INSN, 0xfffff000 }, +    { TRAMP_SENTINEL_INSN } +  }, +  arm_linux_plt_init +}; +  /* Core file and register set support.  */  #define ARM_LINUX_SIZEOF_GREGSET (18 * INT_REGISTER_SIZE) @@ -651,6 +685,8 @@ arm_linux_init_abi (struct gdbarch_info                                 &arm_eabi_linux_sigreturn_tramp_frame);    tramp_frame_prepend_unwinder (gdbarch,                                 &arm_eabi_linux_rt_sigreturn_tramp_frame); +  tramp_frame_prepend_unwinder (gdbarch, +                               &arm_eabi_linux_plt_tramp_frame);    /* Core file support.  */    set_gdbarch_regset_from_core_section (gdbarch, diff -r 92c4c442a2c6 gdb/frame.c --- a/gdb/frame.c       Fri Jul 17 09:43:11 2009 +0800 +++ b/gdb/frame.c       Fri Jul 17 14:17:34 2009 +0800 @@ -1650,6 +1650,7 @@ get_prev_frame (struct frame_info *this_       application.  */    if (this_frame->level >= 0        && get_frame_type (this_frame) == NORMAL_FRAME +      && get_frame_type (this_frame) == GHOST_FRAME        && !backtrace_past_entry        && inside_entry_func (this_frame))      { diff -r 92c4c442a2c6 gdb/frame.h --- a/gdb/frame.h       Fri Jul 17 09:43:11 2009 +0800 +++ b/gdb/frame.h       Fri Jul 17 14:17:34 2009 +0800 @@ -207,7 +207,10 @@ enum frame_type    ARCH_FRAME,    /* Sentinel or registers frame.  This frame obtains register values       direct from the inferior's registers.  */ -  SENTINEL_FRAME +  SENTINEL_FRAME, +  /* This type of frame is not existed in the stack of inferior. +     It can be used for frames that similar to sentinel frame.  */ +  GHOST_FRAME  };  /* For every stopped thread, GDB tracks two frames: current and -------------------------------------------------- ------------- log for 6.8 ------------------------- warning: Lowest section in /home/thinker/progm/android/out/target/ product/generic/symbols/system/lib/libicudata.so is .hash at 00000094 __ioctl () at bionic/libc/arch-arm/syscalls/__ioctl.S:15 15          ldmfd   sp!, {r4, r7} Current language:  auto; currently asm Breakpoint 1 at 0xa78c5424: file external/opencore/engines/player/src/ pv_player_engine.cpp, line 1150. [New Thread 766] [Switching to Thread 766] Breakpoint 1, 0xa78c5424 in PVPlayerEngine::Construct (this=0x12888,     aCmdStatusObserver=0xed7c, aErrorEventObserver=0xed84,     aInfoEventObserver=0xed80)     at external/opencore/engines/player/src/pv_player_engine.cpp:1150 1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5424 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +32>:      adds    r0, r5, r3 Current language:  auto; currently c++ 0xa78c5426      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5426 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +34>:      movs    r1, #0 0xa78c5428      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5428 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +36>:      bl      0xa785991c Program received signal SIGSEGV, Segmentation fault. OsclRegistryClient::UnRegister (this=0x76be00, aComp=@0x0)     at external/opencore/oscl/oscl/osclregcli/src/ oscl_registry_client.cpp:90 90          if (iTlsImpl) 1: x/i $pc 0xa7361504 <_ZN18OsclRegistryClient10UnRegisterER11OSCL_String+4>:             ldr r0, [r0, #8] The program is running.  Exit anyway? (y or n) warning: Lowest section in /home/thinker/progm/android/out/target/ product/generic/symbols/system/lib/libicudata.so is .hash at 00000094 __ioctl () at bionic/libc/arch-arm/syscalls/__ioctl.S:15 15          ldmfd   sp!, {r4, r7} Current language:  auto; currently asm Breakpoint 1 at 0xa78c5424: file external/opencore/engines/player/src/ pv_player_engine.cpp, line 1150. [New Thread 766] [Switching to Thread 766] Breakpoint 1, 0xa78c5424 in PVPlayerEngine::Construct (this=0x12888,     aCmdStatusObserver=0xed7c, aErrorEventObserver=0xed84,     aInfoEventObserver=0xed80)     at external/opencore/engines/player/src/pv_player_engine.cpp:1150 1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5424 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +32>:      adds    r0, r5, r3 Current language:  auto; currently c++ 0xa78c5426      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5426 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +34>:      movs    r1, #0 0xa78c5428      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5428 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +36>:      bl      0xa785991c Program received signal SIGSEGV, Segmentation fault. OsclRegistryClient::UnRegister (this=0x76be00, aComp=@0x0)     at external/opencore/oscl/oscl/osclregcli/src/ oscl_registry_client.cpp:90 90          if (iTlsImpl) 1: x/i $pc 0xa7361504 <_ZN18OsclRegistryClient10UnRegisterER11OSCL_String+4>:             ldr r0, [r0, #8] The program is running.  Exit anyway? (y or n) ---------------------------------------- -------------------- log for cvs -------------------- __ioctl () at bionic/libc/arch-arm/syscalls/__ioctl.S:15 15          ldmfd   sp!, {r4, r7} Current language:  auto; currently asm Breakpoint 1 at 0xa78c5424: file external/opencore/engines/player/src/ pv_player_engine.cpp, line 1150. [Switching to Thread 769] Breakpoint 1, 0xa78c5424 in PVPlayerEngine::Construct (this=0x12888,     aCmdStatusObserver=0xed7c, aErrorEventObserver=0xed84,     aInfoEventObserver=0xed80)     at external/opencore/engines/player/src/pv_player_engine.cpp:1150 1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5424 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +32>:      adds    r0, r5, r3 Current language:  auto; currently c++ 0xa78c5426      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5426 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +34>:      movs    r1, #0 0xa78c5428      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5428 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +36>:      bl      0xa785991c 0xa785991c in ?? ()    from /home/thinker/progm/android/out/target/product/generic/symbols/ system/lib/libopencore_player.so 1: x/i $pc 0xa785991c:     bx      pc #0  0xa785991c in ?? ()    from /home/thinker/progm/android/out/target/product/generic/symbols/ system/lib/libopencore_player.so #0  0xa785991c in ?? ()    from /home/thinker/progm/android/out/target/product/generic/symbols/ system/lib/libopencore_player.so The program is running.  Quit anyway (and kill it)? (y or n) ---------------------------------------- -------------------- log for 6.8 with the patch -------------------- warning: Lowest section in /home/thinker/progm/android/out/target/ product/generic/symbols/system/lib/libicudata.so is .hash at 00000094 __ioctl () at bionic/libc/arch-arm/syscalls/__ioctl.S:15 15          ldmfd   sp!, {r4, r7} Current language:  auto; currently asm Breakpoint 1 at 0xa78c5424: file external/opencore/engines/player/src/ pv_player_engine.cpp, line 1150. [New Thread 768] [Switching to Thread 768] Breakpoint 1, 0xa78c5424 in PVPlayerEngine::Construct (this=0x134a8,     aCmdStatusObserver=0xd434, aErrorEventObserver=0xd43c,     aInfoEventObserver=0xd438)     at external/opencore/engines/player/src/pv_player_engine.cpp:1150 1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5424 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +32>:      adds    r0, r5, r3 Current language:  auto; currently c++ 0xa78c5426      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5426 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +34>:      movs    r1, #0 0xa78c5428      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5428 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +36>:      bl      0xa785991c 0xa785991c in ?? ()    from /home/thinker/progm/android/out/target/product/generic/symbols/ system/lib/libopencore_player.so 1: x/i $pc 0xa785991c:     undefined #0  0xa785991c in ?? ()    from /home/thinker/progm/android/out/target/product/generic/symbols/ system/lib/libopencore_player.so #1  PVPlayerEngine::Construct (this=0x134a8, aCmdStatusObserver=0xd434,     aErrorEventObserver=0xd43c, aInfoEventObserver=0xd438)     at external/opencore/engines/player/src/pv_player_engine.cpp:1151 #2  0xa78ca06c in PVPlayerEngine::New (aCmdStatusObserver=0xd434,     aErrorEventObserver=0xd43c, aInfoEventObserver=0xd438)     at external/opencore/engines/player/src/pv_player_engine.cpp:107 #3  0xa78d4b40 in PVPlayerFactory::CreatePlayer (aCmdStatusObserver=0x135d4,     aErrorEventObserver=0x0, aInfoEventObserver=0x0)     at external/opencore/engines/player/src/pv_player_factory.cpp:49 #4  0xa78d8d0e in PlayerDriver::playerThread (this=0x0)     at external/opencore/android/playerdriver.cpp:870 #5  0xa78d8e10 in PlayerDriver::startPlayerThread (cookie=0x135d4)     at external/opencore/android/playerdriver.cpp:847 #6  0xa9d285d6 in thread_data_t::trampoline (t=)     at frameworks/base/libs/utils/Threads.cpp:109 #7  0xafe0f884 in __thread_entry (     func=0xa9d2856d ,     arg=0xd5a8, tls=0x40407f00) at bionic/libc/bionic/pthread.c:188 #8  0xafe0f3f8 in pthread_create (thread_out=0x0, attr=0xbea5f7f4,     start_routine=0xa9d2856d , arg=0x0) at bionic/libc/bionic/pthread.c:324 #9  0x00000000 in ?? () The program is running.  Exit anyway? (y or n) ---------------------------------------- -------------------- log for cvs with patch -------------------- __ioctl () at bionic/libc/arch-arm/syscalls/__ioctl.S:15 15          ldmfd   sp!, {r4, r7} Current language:  auto; currently asm Breakpoint 1 at 0xa78c5424: file external/opencore/engines/player/src/ pv_player_engine.cpp, line 1150. [Switching to Thread 771] Breakpoint 1, 0xa78c5424 in PVPlayerEngine::Construct (this=0x12a50,     aCmdStatusObserver=0xeee4, aErrorEventObserver=0xeeec,     aInfoEventObserver=0xeee8)     at external/opencore/engines/player/src/pv_player_engine.cpp:1150 1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5424 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +32>:      adds    r0, r5, r3 Current language:  auto; currently c++ 0xa78c5426      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5426 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +34>:      movs    r1, #0 0xa78c5428      1150        iOOTSyncCommandSem.Create(); 1: x/i $pc 0xa78c5428 <_ZN14PVPlayerEngine9ConstructEP23PVCommandStatusObserverP20PVErrorEventObserverP28PVInformationalEventObserver +36>:      bl      0xa785991c 0xa785991c in ?? ()    from /home/thinker/progm/android/out/target/product/generic/symbols/ system/lib/libopencore_player.so 1: x/i $pc 0xa785991c:     bx      pc #0  0xa785991c in ?? ()    from /home/thinker/progm/android/out/target/product/generic/symbols/ system/lib/libopencore_player.so #1  PVPlayerEngine::Construct (this=0x12a50, aCmdStatusObserver=0xeee4,     aErrorEventObserver=0xeeec, aInfoEventObserver=0xeee8)     at external/opencore/engines/player/src/pv_player_engine.cpp:1151 #2  0xa78ca06c in PVPlayerEngine::New (aCmdStatusObserver=0xeee4,     aErrorEventObserver=0xeeec, aInfoEventObserver=0xeee8)     at external/opencore/engines/player/src/pv_player_engine.cpp:107 #3  0xa78d4b40 in PVPlayerFactory::CreatePlayer (aCmdStatusObserver=0x12b7c,     aErrorEventObserver=0x0, aInfoEventObserver=0x0)     at external/opencore/engines/player/src/pv_player_factory.cpp:49 #4  0xa78d8d0e in PlayerDriver::playerThread (this=0x0)     at external/opencore/android/playerdriver.cpp:870 #5  0xa78d8e10 in PlayerDriver::startPlayerThread (cookie=0x12b7c)     at external/opencore/android/playerdriver.cpp:847 #6  0xa9d285d6 in thread_data_t::trampoline (t=)     at frameworks/base/libs/utils/Threads.cpp:109 #7  0xafe0f884 in __thread_entry (     func=0xa9d2856d ,     arg=0xf0e8, tls=0x40507f00) at bionic/libc/bionic/pthread.c:188 #8  0xafe0f3f8 in pthread_create (thread_out=0x0, attr=0xbe9037f4,     start_routine=0xa9d2856d , arg=0x0) at bionic/libc/bionic/pthread.c:324 #9  0x00000000 in ?? () The program is running.  Quit anyway (and kill it)? (y or n) --------------------------------------------------