"Обратный ход остановлен: предыдущий кадр идентичен этому кадру (поврежденный стек?)" В ARM linux
Я пытаюсь отладить segfault при запуске приложения в Linux (архитектура ARM). Я скопировал файл дампа ядра и попытался получить обратную трассировку, используя arm-gdb на хосте x86_64. Это о / п:
$ arm-arago-linux-gnueabi-gdb test_slave6_slave core
GNU gdb (GDB) 7.4
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-oesdk-linux --target=arm-oe-linux-gnueabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/dvdk/test_slave6_slave...done.
warning: exec file is newer than core file.
[New LWP 6411]
[New LWP 6410]
warning: Could not load shared library symbols for 12 libraries, e.g. /lib/libjson-c.so.2.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
Core was generated by `/usr/bin/test_slave6_slave 5 111.111.111.111 1 2 1 2'.
Program terminated with signal 11, Segmentation fault.
#0 0x47b61dd4 in ?? ()
(gdb) bt
#0 0x47b61dd4 in ?? ()
#1 0x47b2e0fc in ?? ()
#2 0x47b2e0fc in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)
(Предупреждение о отметке времени может быть вызвано тем, что я сначала скопировал файл ядра)
Я не думаю, что эта проблема, и моя проблема такая же, как я получаю действительный адрес. Я думаю, что это все еще проблема повреждения стека. Но я не уверен, как отладить это дальше. Должен ли я использовать GDB или valgrind? Кто-нибудь может указать мне на правильные шаги для отладки с использованием этих инструментов. Например, я должен использовать memecheck с valgrind с leak_check?
ОБНОВЛЕНИЕ 1: я использую libcurl для запросов https. Я заметил, что сбой не происходит, когда используется другая версия libcurl без поддержки ssl. (запрос не пройдет, конечно). Libcurl с поддержкой ssl был специально скомпилирован мной.
1 ответ
Ради потомков:
Проблема здесь, скорее всего, заключается просто в том, что отладчик не может проверить те же общие библиотеки, которые использовала программа, так же, как это было сказано в напечатанных им сообщениях.
Более старые версии GDB (например, 7.4, как используется в вопросе) требуют, чтобы библиотеки были расположены в той же древовидной структуре, что и в целевой системе. Поэтому для этого вам нужно будет скопировать все библиотеки, используемые двоичным файлом, в каталог с иерархией, точно такой же, как на целевом хосте. Если вы назовете этот каталог target
тогда вы можете сказать GDB, чтобы найти библиотеки в нем с set sysroot ./target/
Кажется, что более современные версии GDB могут найти каждую библиотеку, только если все они собраны в одном каталоге, и тогда вы можете указать GDB, куда вы их поместили, используя set solib-absolute-prefix
а также set solib-search-path
в обе точки на этот каталог. Иногда у меня все еще возникают проблемы с правильной работой в первый раз, и мне приходится повторять попытки с самого начала несколько раз, чтобы все заклинания были правильными и в правильном порядке.
Здесь я использую более свежую сборку GDB со всеми библиотеками в ~/tmp/arm-lib
, Обратите внимание, что я не поместил имя файла ядра в командной строке!
$ gdb ktest-arm
GNU gdb (GDB) 7.12.0.20161109-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ktest-arm...done.
(gdb) show architecture
The target architecture is set automatically (currently arm)
(gdb) set solib-absolute-prefix ~/tmp/arm-lib/
(gdb) set solib-search-path ~/tmp/arm-lib/
(gdb) core-file ~/tmp/ktest-arm-core
warning: core file may not match specified executable file.
[New LWP 905]
Core was generated by `./ktest'.
Program terminated with signal SIGQUIT, Quit.
#0 0x40134264 in nanosleep () from /home/woods/tmp/arm-lib/libc.so.6
(gdb) bt
#0 0x40134264 in nanosleep () from /home/woods/tmp/arm-lib/libc.so.6
#1 0x00008c9c in main () at /home/woods/tmp/testing/ktest.c:9
(gdb)