У меня проблемы с отладкой многопоточного приложения C ++ для целей ARMv7.Эта проблема проявляется в двух разных целях ARM, и я использую для них разные наборы инструментов:
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Я проверил некоторые потоки, но (из-за одной и той же проблемы с минималистической программой многопоточности) кажется,что у меня * нет поврежденного стека * нет проблем с виртуальными функциями или указателями на функции
В основном я использую цель Toradex Colibri iMX6 с Angstrom Linux 2016.12.12 работает на нем.
Вопросы
- Что-то не так с тем, как я собираю программу?
- есть что-то еще.неправильно с тем, как я использую
gdbserver
/ gdb
? - , какие параметры мне нужно исправить для вывода отладчика?
Я отлаживаю с помощью gdbserver
нацель и набор инструментов arm-linux-gnueabihf-gdb
на моем хосте.Там нет родной gdb
для любой из целей.Я могу собрать приложение для Linux x86 , но пока не могу воспроизвести ошибку на ПК.
SW-problem
Кажется, что два потоказависают, возможно, из-за тупика двух мьютексов или потока, пытающегося получить один мьютекс во второй раз (хотя это кажется маловероятным, ошибка обнаружилась после того, как я настроил мьютекс как рекурсивный ;Мне придется проверить второй мьютекс, используемый в этом потоке).
Кажется, что все остальные потоки работают нормально.
SW-build и отладочная конфигурация
Buildнастройки:
Я использую набор инструментов, предоставленный Toradex с arm-linux-gnueabihf-g++
и
-std=c++11 -Wall -Werror -Wextra -Wno-unused-result -Winit-self -Wmissing-include-dirs -Wpointer-arith -Wno-format-security -Wno-implicit-fallthrough -Wl,-Map=output.map -ggdb -g3 -fno-inline -O0
Я передаю ту же программу отладчикам (то есть на gdbserver
на цели и наarm-linux-gnueabihf-gdb
на хосте)
$ (gdb) set sysroot </path/to/libs>
$ (gdb) file <binary>
$ (gdb) target remote IP:port
разделяемые библиотеки:
Для разделяемых библиотек я скопировал /usr/lib
и /lib
из цели на хост.Затем я скачал библиотеки отладки, которые доступны для цели / дистрибутива, и заменил оригинальные общие библиотеки на них.
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x76fcf800 0x76feaa70 Yes /path/to/libs/lib/ld-linux-armhf.so.3
0x76fb9700 0x76fbcd2c Yes /path/to/libs/lib/librt.so.1
0x76f940c0 0x76fa2e0c Yes /path/to/libs/lib/libpthread.so.0
0x76f01630 0x76f72a10 Yes (*) /path/to/libs/usr/lib/libstdc++.so.6
0x76e14d38 0x76e48028 Yes /path/to/libs/lib/libm.so.6
0x76e041b0 0x76e0e7ec Yes /path/to/libs/lib/libgcc_s.so.1
0x76cd1000 0x76dc2b10 Yes /path/to/libs/lib/libc.so.6
0x7449c96c 0x744a29e4 Yes /path/to/libs/lib/libnss_files.so.2
(*): Shared library is missing debugging information.
Я не смог найти библиотеку отладки для libstdc++.so.6
.
Результаты отладки
Отладка простого однопоточного приложения с падением на цели:
- работает, т.е. не выдает сообщение об ошибке сверху
Отладка простого многопоточного приложения с тупиковой блокировкой или без нее на цели:
(gdb) bt
#0 0x76d6cd44 in uname () at ../sysdeps/unix/syscall-template.S:84
#1 0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Отладка того же простого многопоточного приложения с помощью илибез тупиков, в Linux-x86:
Отладка глючного приложения на ПК:
- похоже, что работает, но мы пока не можем воспроизвести ошибку
Отладка уязвимого приложения на цели:
Thread 1 received signal SIGINT, Interrupt.
0x76f9facc in __lll_robust_lock_wait (futex=0x257b94 <namespace1::function()::su_place+20>, private=0)
at /usr/src/debug/glibc/2.24-r0/git/nptl/lowlevelrobustlock.c:46
46 /usr/src/debug/glibc/2.24-r0/git/nptl/lowlevelrobustlock.c: No such file or directory.
(gdb) thread apply all bt
Thread 6 (Thread 6606.6630):
#0 0x76d832c8 in __setreuid (ruid=8, euid=0)
at /usr/src/debug/glibc/2.24-r0/git/sysdeps/unix/sysv/linux/i386/setreuid.c:29
#1 0x7efff06c in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Thread 5 (Thread 6606.6629):
#0 0x76d55d44 in uname () at ../sysdeps/unix/syscall-template.S:84
#1 0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Thread 4 (Thread 6606.6628):
#0 0x76d55d44 in uname () at ../sysdeps/unix/syscall-template.S:84
#1 0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Thread 3 (Thread 6606.6627):
#0 0x76d55d44 in uname () at ../sysdeps/unix/syscall-template.S:84
#1 0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Thread 2 (Thread 6606.6626):
#0 __lll_robust_lock_wait (
futex=0x25b950 <namespace_2::a_function()::a_static_member+152>, private=128)
at /usr/src/debug/glibc/2.24-r0/git/nptl/lowlevelrobustlock.c:31
#1 0x00000080 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Thread 1 (Thread 6606.6606):
#0 0x76f9facc in __lll_robust_lock_wait (futex=0x257b94 <namespace1::function()::su_place+20>,
private=0) at /usr/src/debug/glibc/2.24-r0/git/nptl/lowlevelrobustlock.c:46
#1 0x00000002 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Обновление
Я мог бы найти ошибку (взаимная блокировка мьютекса), используя valgrind
при сборке ПО на ПК.
Однако проблема здесь связана с проблемами с gdb
, которые я еще не мог понять или решить.