Инструкция не восстанавливается при достижении точки останова GDB - PullRequest
2 голосов
/ 28 марта 2019

Фон

Я отлаживаю приложение Android (ARM), используя gdb и gdbserver (GDB версия 7.11).Мой хост gdb работает на Windows 10, а отлаженный Android - Samsung Galaxy J7, подключенный через USB.

Хост и цель хорошо связаны, gdb, кажется, работает хорошо.Я могу установить точку останова на месте в целевом / отлаженном приложении и сделать так, чтобы точка останова была нажата.

Проблема

Когда точка останова достигнутанаблюдаются следующие проблемы:

  • инструкция ARM по адресу точки останова читает udf #16, а не исходную инструкцию.
    • Инструкция ARM udf представляет собой кодировку постоянно НЕ УКАЗАННАЯ , которая, кажется, используется для реализации внутреннего механизма перехвата точек останова.При выполнении инструкции udf #16, которая генерирует сигнал TRAP, полученный отладчиком.
  • Отладчик всегда должен восстанавливать исходную инструкцию при достижении точки останова.В моей системе этого не происходит.
  • При выполнении команды ni (следующая инструкция) снова и снова выполняется инструкция udf #16.
  • Удаление точки останова не восстанавливает исходную инструкцию.Вместо этого инструкция udf #16 остается в памяти.
  • Увеличение регистра $ pc на четыре (4) просто пропускает исходную инструкцию, которая должна была там быть.
  • Удаление всех точек останова и продолжение gdbпросто нажимает команду udf #16 снова и снова.

Вот как выглядят инструкции до того, как будет достигнута точка останова:

(gdb) x/3i 0xd04dc520
0xd04dc520:  mov     r0, r4
0xd04dc524:  bl      0xd04d7af4 <avio_rb32>
0xd04dc528:  ldr     r6, [sp, #40]   ; 0x28

А вот как это выглядит после того, как достигнута точка останова:

 (gdb) x/3i 0xd04dc520
 0xd04dc520:  udf     #16
 0xd04dc524:  bl      0xd04d7af4 <avio_rb32>
 0xd04dc528:  ldr     r6, [sp, #40]   ; 0x28

Отладчик gdb не может восстановить исходную инструкцию в точке останова при нажатии.Поиск в Интернете не выявил никого, кто сталкивался с такой же проблемой.

Параметр «установить точку останова всегда вставлен»

Назначение параметра breakpoint always-inserted [off/on]очевидно, предназначено именно для контроля того, восстанавливает ли отладчик инструкцию в точке останова или нет.Цитируя документацию :

GDB обычно реализует точки останова, заменяя программный код на адресе точки останова специальной инструкцией, которая при выполнении дает управление отладчику.По умолчанию код программы изменяется таким образом, только когда программа возобновляется.Как только программа останавливается, GDB восстанавливает исходные инструкции.Такое поведение защищает от оставления точек останова, вставленных в цель, в случае внезапного отключения GDB.Однако при использовании медленных удаленных целей вставка и удаление точки останова может снизить производительность.Этим поведением можно управлять с помощью следующих команд:

установить точку останова всегда вставленной выключено

Все точки останова, включая вновь добавленные пользователем, вставляются только в целькогда цель возобновлена.Все точки останова удаляются из цели, когда она останавливается.Это режим по умолчанию.

установить точку останова, всегда вставляемую в

Вызывает все точки останова, которые всегда вставляются в цель.Если пользователь добавляет новую точку останова или изменяет существующую точку останова, точки останова в цели обновляются немедленно.Точка останова удаляется из цели только при удалении самой точки останова.

Значение off для breakpoint always-inserted - это именно то, что нам нужно.Действительно, это значение моего gdb, когда возникает проблема (см. Устанавливаемые параметры ниже), поэтому загадка углубляется.

Соответствующая информация

Ниже приводитсяпронумерованный gdb журнал сеанса, который ясно показывает проблему вместе с моими комментариями.

1. (gdb) show version
2. GNU gdb (GDB) 7.11
3. Copyright (C) 2016 Free Software Foundation, Inc.
4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
5. This is free software: you are free to change and redistribute it.
6. There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
7. and "show warranty" for details.
8. This GDB was configured as "x86_64-w64-mingw32".
9. Type "show configuration" for configuration details.
10.  For bug reporting instructions, please see:
11.  <http://www.gnu.org/software/gdb/bugs/>.
12.  Find the GDB manual and other documentation resources online at:
13.  <http://www.gnu.org/software/gdb/documentation/>.
14.  For help, type "help".
15.  Type "apropos word" to search for commands related to "word".
16.  (gdb) handle SIG33 nostop noprint
17.  Signal        Stop      Print   Pass to program Description
18.  SIG33         No        No      Yes             Real-time event 33
19.  (gdb) handle SIGSEGV nostop print
20.  Signal        Stop      Print   Pass to program Description
21.  SIGSEGV       No        Yes     Yes             Segmentation fault
22.  (gdb) set pagination off
23.  (gdb) info set
24.  ...
25.  (gdb) target remote :9999
26.  Remote debugging using :9999
27.  Reading /system/bin/app_process32 from remote target...
28.  ...
29.  Reading /system/bin/linker from remote target...
30.  0xf72480b0 in __epoll_pwait () from target:/system/lib/libc.so
31.  (gdb) info sharedlibrary libFFmpeg
32.  From        To          Syms Read   Shared Object Library
33.  0xd04b2f80  0xd063ec98  Yes (*)     target:/data/app/com.test.media/lib/arm/libFFmpeg.so
34.  (*): Shared library is missing debugging information.
35.  (gdb) x/3i 0xd04dc520
36.     0xd04dc520:  mov     r0, r4
37.     0xd04dc524:  bl      0xd04d7af4 <avio_rb32>
38.     0xd04dc528:  ldr     r6, [sp, #40]   ; 0x28
39.  (gdb) b *0xd04dc520
40.  Breakpoint 1 at 0xd04dc520
41.  (gdb) x/3i 0xd04dc520
42.     0xd04dc520:  mov     r0, r4
43.     0xd04dc524:  bl      0xd04d7af4 <avio_rb32>
44.     0xd04dc528:  ldr     r6, [sp, #40]   ; 0x28
45.  (gdb) info break
46.  Num     Type           Disp Enb Address    What
47.  1       breakpoint     keep y   0xd04dc520
48.  (gdb) c
49.  Continuing.
50.  [New Thread 3313.12241]
51.  [New Thread 3313.12243]
52.  [New Thread 3313.12257]
53.  [New Thread 3313.12271]
54.  [New Thread 3313.12323]
55.  [New Thread 3313.12326]
56.  [New Thread 3313.12335]
57.  [New Thread 3313.12338]
58.  [New Thread 3313.12339]
59.  [New Thread 3313.12342]
60.  [New Thread 3313.12343]
61.  [New Thread 3313.12344]
62.  [New Thread 3313.12355]
63.  Reading /system/lib/libsfextcmn.so from remote target...
64.  [New Thread 3313.12360]
65.  Reading /system/lib/libsfextcmn.so from remote target...
66.  [New Thread 3313.12409]
67.  [Switching to Thread 3313.12343]
68.  
69.  Thread 160 "mmt_hVideoPlaye" hit Breakpoint 1, 0xd04dc520 in ?? () from target:/data/app/com.test.media/lib/arm/libFFmpeg.so
70.  (gdb) x/3i 0xd04dc520
71.  => 0xd04dc520:  udf     #16
72.     0xd04dc524:  bl      0xd04d7af4 <avio_rb32>
73.     0xd04dc528:  ldr     r6, [sp, #40]   ; 0x28
74.  (gdb) ni
75.  
76.  Thread 160 "mmt_hVideoPlaye" hit Breakpoint 1, 0xd04dc520 in ?? () from target:/data/app/com.test.media/lib/arm/libFFmpeg.so
77.  (gdb) info reg pc
78.  pc             0xd04dc520       0xd04dc520
79.  (gdb) x/i $pc
80.  => 0xd04dc520:  udf     #16
81.  (gdb) ni
82.  
83.  Thread 160 "mmt_hVideoPlaye" hit Breakpoint 1, 0xd04dc520 in ?? () from target:/data/app/com.test.media/lib/arm/libFFmpeg.so
84.  (gdb) ni
85.  
86.  Thread 160 "mmt_hVideoPlaye" hit Breakpoint 1, 0xd04dc520 in ?? () from target:/data/app/com.test.media/lib/arm/libFFmpeg.so
87.  (gdb) ni
88.  
89.  Thread 160 "mmt_hVideoPlaye" hit Breakpoint 1, 0xd04dc520 in ?? () from target:/data/app/com.test.media/lib/arm/libFFmpeg.so
90.  (gdb) c
91.  Continuing.
92.  
93.  Thread 160 "mmt_hVideoPlaye" hit Breakpoint 1, 0xd04dc520 in ?? () from target:/data/app/com.test.media/lib/arm/libFFmpeg.so
94.  (gdb) delete 1
95.  (gdb) info break
96.  No breakpoints or watchpoints.
97.  (gdb) c
98.  Continuing.
99.  [New Thread 3313.12547]
100.  
101.  Thread 160 "mmt_hVideoPlaye" received signal SIGTRAP, Trace/breakpoint trap.
102.  0xd04dc520 in ?? () from target:/data/app/com.test.media/lib/arm/libFFmpeg.so
103.  (gdb)

Строки 2-8: версия GDB 7.11, настроенная для x86_64-w64-mingw32.

Строки 16-21: Обработка сигналов SIG33 и SIGSEGV.

Строки 31-33: Определить загруженный адрес сегмента общего объекта libFFmpeg .text (0xd04b2f80).Это позволило мне вычислить точный адрес точки прерывания инструкции, который я хотел (0xd04dc520).

Строки 35-38: вывод инструкций в и после предполагаемого адреса точки останова.

Строка 39: Настройкаточка останова 1 в 0xd04dc520.

Строки 41-44: вывод инструкций на и после адреса предполагаемой точки останова после установки точки останова.

Строка 48: Продолжить выполнение.

Строки 50-68: выполнение продолжается, взаимодействие с устройством вызывает попадание в точку останова.

Строка 69: Достигается точка останова 1.

Строки 70-73: перечисление инструкции вадрес точки останова.Инструкция, которая изначально была mov r0, r4, теперь udf #16.

Строки 74-80: Выполнение команды ni держит $ pc в том же месте, udf #16 полностью нас заманивает в ловушку.

Линии 81-89: несколько ni держат нас в одном месте.

Линии 90-93: Команда continue также удерживает нас в ловушке.

Линии 94-102: Удаление всех точек останова не приводит к восстановлению инструкции, команда continue попадает на udf #16, который не был восстановлен.


Вот некоторые соответствующие настраиваемые параметры GDB:

architecture:  The target architecture is set automatically (currently arm)
arm abi:  The current ARM ABI is "auto" (currently "AAPCS").
arm apcs32:  Usage of ARM 32-bit mode is on.
arm disassembler:  The disassembly style is "std".
arm fallback-mode:  The current execution mode assumed (when symbols are unavailable) is "auto".
arm force-mode:  The current execution mode assumed (even when symbols are available) is "auto".
arm fpu:  The current ARM floating point model is "auto".
auto-connect-native-target:  Whether GDB may automatically connect to the native target is on.
auto-load gdb-scripts:  Auto-loading of canned sequences of commands scripts is on.
auto-load local-gdbinit:  Auto-loading of .gdbinit script from current directory is on.
auto-load python-scripts:  Auto-loading of Python scripts is on.
auto-load safe-path:  List of directories from which it is safe to auto-load files is $debugdir:$datadir/auto-load.
auto-load scripts-directory:  List of directories from which to load auto-loaded scripts is $debugdir:$datadir/auto-load.
auto-load-scripts:  Auto-loading of Python scripts is on.
auto-solib-add:  Autoloading of shared library symbols is on.
breakpoint always-inserted:  Always inserted breakpoint mode is off.
breakpoint auto-hw:  Automatic usage of hardware breakpoints is on.
breakpoint condition-evaluation:  Breakpoint condition evaluation mode is auto (currently host).
breakpoint pending:  Debugger's behavior regarding pending breakpoints is auto.
can-use-hw-watchpoints:  Debugger's willingness to use watchpoint hardware is 1.
debug aarch64:  AArch64 debugging is off.
debug arch:  Architecture debugging is 0.
debug arm:  ARM debugging is off.
disassemble-next-line:  Debugger's willingness to use disassemble-next-line is off.
disassembly-flavor:  The disassembly flavor is "att".
osabi:  The current OS ABI is "auto" (currently "Cygwin").
The default OS ABI is "Cygwin".remote breakpoint-commands-packet:  Support for the `BreakpointCommands' packet is auto-detected, currently unknown.
remote btrace-conf-bts-size-packet:  Support for the `Qbtrace-conf:bts:size' packet is auto-detected, currently unknown.
remote btrace-conf-pt-size-packet:  Support for the `Qbtrace-conf:pt:size' packet is auto-detected, currently unknown.
remote catch-syscalls-packet:  Support for the `QCatchSyscalls' packet is auto-detected, currently unknown.
remote conditional-breakpoints-packet:  Support for the `ConditionalBreakpoints' packet is auto-detected, currently unknown.
remote conditional-tracepoints-packet:  Support for the `ConditionalTracepoints' packet is auto-detected, currently unknown.
remote ctrl-c-packet:  Support for the `vCtrlC' packet is auto-detected, currently unknown.
remote disable-btrace-packet:  Support for the `Qbtrace:off' packet is auto-detected, currently unknown.
remote disable-randomization-packet:  Support for the `QDisableRandomization' packet is auto-detected, currently unknown.
remote enable-btrace-bts-packet:  Support for the `Qbtrace:bts' packet is auto-detected, currently unknown.
remote enable-btrace-pt-packet:  Support for the `Qbtrace:pt' packet is auto-detected, currently unknown.
remote exec-event-feature-packet:  Support for the `exec-event-feature' packet is auto-detected, currently unknown.
remote exec-file:  (null)
remote fast-tracepoints-packet:  Support for the `FastTracepoints' packet is auto-detected, currently unknown.
remote fetch-register-packet:  Support for the `p' packet is auto-detected, currently unknown.
remote fork-event-feature-packet:  Support for the `fork-event-feature' packet is auto-detected, currently unknown.
remote get-thread-information-block-address-packet:  Support for the `qGetTIBAddr' packet is auto-detected, currently unknown.
remote get-thread-local-storage-address-packet:  Support for the `qGetTLSAddr' packet is auto-detected, currently unknown.
remote hardware-breakpoint-limit:  The maximum number of target hardware breakpoints is -1.
remote hardware-breakpoint-packet:  Support for the `Z1' packet is auto-detected, currently unknown.
remote hardware-watchpoint-length-limit:  The maximum length (in bytes) of a target hardware watchpoint is -1.
remote hardware-watchpoint-limit:  The maximum number of target hardware watchpoints is -1.
remote hostio-close-packet:  Support for the `vFile:close' packet is auto-detected, currently unknown.
remote hostio-fstat-packet:  Support for the `vFile:fstat' packet is auto-detected, currently unknown.
remote hostio-open-packet:  Support for the `vFile:open' packet is auto-detected, currently unknown.
remote hostio-pread-packet:  Support for the `vFile:pread' packet is auto-detected, currently unknown.
remote hostio-pwrite-packet:  Support for the `vFile:pwrite' packet is auto-detected, currently unknown.
remote hostio-readlink-packet:  Support for the `vFile:readlink' packet is auto-detected, currently unknown.
remote hostio-setfs-packet:  Support for the `vFile:setfs' packet is auto-detected, currently unknown.
remote hostio-unlink-packet:  Support for the `vFile:unlink' packet is auto-detected, currently unknown.
remote hwbreak-feature-packet:  Support for the `hwbreak-feature' packet is auto-detected, currently unknown.
remote install-in-trace-packet:  Support for the `InstallInTrace' packet is auto-detected, currently unknown.
remote interrupt-on-connect:  W whether interrupt-sequence is sent to remote target when gdb connects to is off.
remote interrupt-sequence:  Send the ASCII ETX character (Ctrl-c) to the remote target to interrupt the execution of the program.
remote kill-packet:  Support for the `vKill' packet is auto-detected, currently unknown.
remote library-info-packet:  Support for the `qXfer:libraries:read' packet is auto-detected, currently unknown.
remote library-info-svr4-packet:  Support for the `qXfer:libraries-svr4:read' packet is auto-detected, currently unknown.
remote memory-map-packet:  Support for the `qXfer:memory-map:read' packet is auto-detected, currently unknown.
remote memory-read-packet-size:  The memory-read-packet-size is 0. Packets are limited to 648 bytes.
remote memory-write-packet-size:  The memory-write-packet-size is 0. Packets are limited to 648 bytes.
remote multiprocess-feature-packet:  Support for the `multiprocess-feature' packet is auto-detected, currently unknown.
remote no-resumed-stop-reply-packet:  Support for the `N stop reply' packet is auto-detected, currently unknown.
remote noack-packet:  Support for the `QStartNoAckMode' packet is auto-detected, currently unknown.
remote osdata-packet:  Support for the `qXfer:osdata:read' packet is auto-detected, currently unknown.
remote p-packet:  remote pass-signals-packet:  Support for the `QPassSignals' packet is auto-detected, currently unknown.
remote pid-to-exec-file-packet:  Support for the `qXfer:exec-file:read' packet is auto-detected, currently unknown.
remote program-signals-packet:  Support for the `QProgramSignals' packet is auto-detected, currently unknown.
remote query-attached-packet:  Support for the `qAttached' packet is auto-detected, currently unknown.
remote read-aux-vector-packet:  Support for the `qXfer:auxv:read' packet is auto-detected, currently unknown.
remote read-btrace-conf-packet:  Support for the `qXfer:btrace-conf' packet is auto-detected, currently unknown.
remote read-btrace-packet:  Support for the `qXfer:btrace' packet is auto-detected, currently unknown.
remote read-fdpic-loadmap-packet:  Support for the `qXfer:fdpic:read' packet is auto-detected, currently unknown.
remote read-sdata-object-packet:  Support for the `qXfer:statictrace:read' packet is auto-detected, currently unknown.
remote read-siginfo-object-packet:  Support for the `qXfer:siginfo:read' packet is auto-detected, currently unknown.
remote read-spu-object-packet:  Support for the `qXfer:spu:read' packet is auto-detected, currently unknown.
remote read-watchpoint-packet:  Support for the `Z3' packet is auto-detected, currently unknown.
remote reverse-continue-packet:  Support for the `bc' packet is auto-detected, currently unknown.
remote reverse-step-packet:  Support for the `bs' packet is auto-detected, currently unknown.
remote run-packet:  Support for the `vRun' packet is auto-detected, currently unknown.
remote search-memory-packet:  Support for the `qSearch:memory' packet is auto-detected, currently unknown.
remote set-register-packet:  Support for the `P' packet is auto-detected, currently unknown.
remote software-breakpoint-packet:  Support for the `Z0' packet is auto-detected, currently unknown.
remote static-tracepoints-packet:  Support for the `StaticTracepoints' packet is auto-detected, currently unknown.
remote supported-packets-packet:  Support for the `qSupported' packet is auto-detected, currently unknown.
remote swbreak-feature-packet:  Support for the `swbreak-feature' packet is auto-detected, currently unknown.
remote symbol-lookup-packet:  Support for the `qSymbol' packet is auto-detected, currently unknown.
remote system-call-allowed:  Calling host system(3) call from target is not allowed
remote target-features-packet:  Support for the `qXfer:features:read' packet is auto-detected, currently unknown.
remote thread-events-packet:  Support for the `QThreadEvents' packet is auto-detected, currently unknown.
remote threads-packet:  Support for the `qXfer:threads:read' packet is auto-detected, currently unknown.
remote trace-buffer-size-packet:  Support for the `QTBuffer:size' packet is auto-detected, currently unknown.
remote trace-status-packet:  Support for the `qTStatus' packet is auto-detected, currently unknown.
remote traceframe-info-packet:  Support for the `qXfer:traceframe-info:read' packet is auto-detected, currently unknown.
remote unwind-info-block-packet:  Support for the `qXfer:uib:read' packet is auto-detected, currently unknown.
remote verbose-resume-packet:  Support for the `vCont' packet is auto-detected, currently unknown.
remote verbose-resume-supported-packet:  Support for the `vContSupported' packet is auto-detected, currently unknown.
remote vfork-event-feature-packet:  Support for the `vfork-event-feature' packet is auto-detected, currently unknown.
remote write-siginfo-object-packet:  Support for the `qXfer:siginfo:write' packet is auto-detected, currently unknown.
remote write-spu-object-packet:  Support for the `qXfer:spu:write' packet is auto-detected, currently unknown.
remote write-watchpoint-packet:  Support for the `Z2' packet is auto-detected, currently unknown.
remoteaddresssize:  The maximum size of the address (in bits) in a memory packet is 0.
remotebreak:  remotecache:  Deprecated remotecache flag is off.
step-mode:  Mode of the step operation is off.

Вопрос

Почему отладчик gdb не может выполнить одну из самых простых и критических операций отладчика, т. Е. Восстановить инструкцию при достижении точки останова?

...