Ошибка GDB: обратная трассировка остановлена: предыдущий кадр идентичен этому кадру (поврежденный стек?) - PullRequest
0 голосов
/ 25 октября 2018

У меня проблемы с отладкой многопоточного приложения 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, которые я еще не мог понять или решить.

1 Ответ

0 голосов
/ 25 октября 2018

Затем я скачал библиотеки отладки, которые доступны для цели / дистрибутива, и заменил на них оригинальные общие библиотеки.

Возможно, это неправильно (в зависимости ото том, что именно вы подразумеваете под "отладочными библиотеками"), и может способствовать вашей проблеме.См. этот ответ .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...