Сложно отлаживать приложения из библиотеки облаков точек, возможно, из-за многопоточности?

Я использую библиотеку Point Cloud с cmake для компиляции и собираю ее в режиме отладки, но моя программа не вызывает ошибку или прерывает работу так, как я ожидаю.

В частности, я получаю сообщения, подобные этому:

(gdb) run bunny
Starting program: debug/our_cvfh bunny
libc++abi.dylib: terminating
[New Thread 0x170b of process 80178]

Program received signal SIGABRT, Aborted.
0x00007fff88c6f866 in ?? ()
(gdb) bt
#0  0x00007fff88c6f866 in ?? ()
#1  0x00007fff8bb5235c in ?? ()
#2  0x0000000000000000 in ?? ()
(gdb) break rec/registered_views_source.h:305
Cannot access memory at address 0x961d60

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

PCL создает другой поток, и поэтому я не могу вернуться? Я не делаю никаких визуализаций прямо сейчас, поэтому я не могу понять, почему он использует потоки.

Я также попытался запустить программу в каталоге отладки, а не из моего исходного корневого каталога. Вот еще один пример того, как он не работает:

$ gdb our_cvfh
GNU gdb (GDB) 7.7
Copyright (C) 2014 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-apple-darwin13.1.0".
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 our_cvfh...done.
run (gdb) run
Starting program: /Users/jwoods/Projects/lidargl/fpfh/debug/our_cvfh
[New Thread 0x170b of process 33571]

Program received signal SIGSEGV, Segmentation fault.
0x000000010016cdec in ?? ()
(gdb) bt
#0  0x000000010016cdec in ?? ()
#1  0x00007fff5fbfbd08 in ?? ()
#2  0x00007fff5fbfbcc0 in ?? ()
#3  0x00007fff5fbfbcc8 in ?? ()
#4  0x00007fff5fbfbcc8 in ?? ()
#5  0x00007fff5fbfbcc8 in ?? ()
#6  0xffffffffffffffff in ?? ()
#7  0x00007fff5fbfbcc8 in ?? ()
#8  0x00007fff5fbfbcc8 in ?? ()
#9  0x00007fff5fbfbcc0 in ?? ()
#10 0x00007fff5fbfbcc0 in ?? ()
#11 0x00007fff5fbfbcc8 in ?? ()
#12 0x00007fff5fbfbcc8 in ?? ()
#13 0x00007fff5fbfbcc8 in ?? ()
#14 0x00007fff5fbff4a8 in ?? ()
#15 0x00007fff5fbff4d8 in ?? ()
#16 0x00007fff5fbff420 in ?? ()
#17 0x00007fff5fbff4d8 in ?? ()
#18 0x0000000000000000 in ?? ()
(gdb)

GDB работает нормально, когда я не использую CMake, так что я думаю, что это как-то связано с CMake. Похоже, что это не представляет проблемы для кого-то еще, что говорит мне, что это также может быть связано с тем, что я использую CMake с Mac OS X.

Как мне получить нормальное поведение GDB?

Обновить

я могу бежать dsymutil my_output_binary для того, чтобы сгенерировать символы отладки (следующие make). Это обходной путь. Я хотел бы, чтобы это было сделано автоматически, и не уверен, почему это не так. dsymutil Стратегия работает для большинства segfaults, но не работает для некоторых случаев SIGABRT. Вот вывод:

Calling compute <--- normal std::cerr output of my program, single-threaded
Assertion failed: (index >= 0 && index < size()), function operator[], file /usr/local/Cellar/eigen/3.2.1/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h, line 378.
[New Thread 0x170b of process 64108]

Program received signal SIGABRT, Aborted.
0x00007fff84999866 in ?? ()
(gdb) bt
#0  0x00007fff84999866 in ?? ()
#1  0x00007fff862c335c in ?? ()
#2  0x0000000000000000 in ?? ()
(gdb) info threads
Id   Target Id         Frame
2    Thread 0x170b of process 64108 0x00007fff8499a662 in ?? ()
* 1    Thread 0x1503 of process 64108 0x00007fff84999866 in ?? ()
(gdb)

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

Я попытался отключить многопоточность с Eigen, который используется PCL.

Что интересно, lldb может генерировать обратные следы, но мне любопытно, почему GDB не может.

4

Решение

Кроме простого использования LLDB вместо GDB, я не понял, как отлаживать потоки.

Однако я понял, как автоматически создавать символы отладки! Ура.

Вам нужно три файла:

Поместите это в свой проект cmake/Modules/ каталог.

В CMakeLists.txtвам понадобятся следующие строки после объявления вашего проекта:

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/")

if (APPLE) # this if statement is optional, but you definitely need the include()
include(UseDebugSymbols)
endif (APPLE)

Это будет выглядеть в соответствующем месте.

Должен отметить, что я одновременно внес еще одно изменение в свой проект, что также может быть полезно для вас. В моем add_executable строку, сразу после названия цели, я добавил MACOSX_BUNDLE, Этот флаг заставит его быть скомпилированным как .app вместо обычного двоичного файла. Вот пример из моего проекта:

add_executable(pose MACOSX_BUNDLE pose.cpp rec/global_nn_recognizer_cvfh.cpp rec/global_nn_recognizer_cvfh.hpp rec/render_views_tesselated_sphere.cpp)
0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector