2017-02-15 2 views
2

Я перекрестно скомпилировал приложение, которое использует boost :: asio library и протестировало его в моей целевой системе. Он работает правильно. Но когда я пытаюсь отладить мое приложение с помощью GDB, я получаю это сообщение в GdB-консоли:Ошибка сегментации только во время отладки GDB

Program received signal SIGSEGV, Segmentation fault. 
_dl_debug_initialize (ldbase=4294967292, ns=1996288212) at dl-debug.c:55 
55   if (r->r_map == NULL || ldbase != 0) 

Результат одинаковый для удаленной и родной отладки, а также для ряда других библиотек наддува (но не для всех) , После поиска любой информации, которая может быть полезна, я нашел аналогичную проблему в этом документе (стр.63): http://support.garz-fricke.com/products/Santaro/Linux-Yocto/Releases/Yocto-jethro-5.1-r6859-0/GUF-Yocto-jethro-5.1-r6859-0-IMX6GUF-Manual.pdf Как сказано в документе, проблема может быть вызвана «статическим инициализацией в неявно реализованных методах C++» и связана с glibc , Так что я попытался воспроизвести эту ошибку при таком подходе с кодом:

#include <iostream> 
using namespace std; 
class AClass 
{ 
public: 
    void foo() 
    { 
    static int NmbOfInvokes = 0; 
    NmbOfInvokes++; 
    cout << NmbOfInvokes << endl; 
    } 
}; 
int main(void) 
{ 
    cout << "Hello World" << endl; 

    AClass anInstance; 
    anInstance.foo(); 
    anInstance.foo(); 
    return 0; 
} 

Эта программа работает нормально, но при отладке не удается с той же ошибкой SIGSEGV.

Чтобы это исправить достаточно переписать класс AClass таким образом:

class AClass 
{ 
public: 
    void foo(); 
}; 

void AClass::foo() 
{ 
    static int NmbOfInvokes = 0; 
    NmbOfInvokes++; 
    cout << NmbOfInvokes << endl; 
} 

флагов компиляции:

arm-poky-linux-gnueabi-g++ -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-1.2.0/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi -DHAVE_CONFIG_H -I. -I.. --sysroot=/opt/fsl-imx-x11/4.1.15-1.2.0/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi -g -O0 --sysroot=/opt/fsl-imx-x11/4.1.15-1.2.0/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi -MT SegFault_Reproduce.o -MD -MP -MF .deps/SegFault_Reproduce.Tpo -c -o SegFault_Reproduce.o SegFault_Reproduce.cpp mv -f .deps/SegFault_Reproduce.Tpo .deps/SegFault_Reproduce.Po 
../arm-poky-linux-gnueabi-libtool --tag=CXX --mode=link arm-poky-linux-gnueabi-g++ -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-1.2.0/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi -g -O0 --sysroot=/opt/fsl-imx-x11/4.1.15-1.2.0/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi --sysroot=/opt/fsl-imx-x11/4.1.15-1.2.0/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi -o SegFault_Reproduce SegFault_Reproduce.o 
arm-poky-linux-gnueabi-libtool: link: arm-poky-linux-gnueabi-g++ -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-1.2.0/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi -g -O0 --sysroot=/opt/fsl-imx-x11/4.1.15-1.2.0/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi --sysroot=/opt/fsl-imx-x11/4.1.15-1.2.0/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi -o SegFault_Reproduce SegFault_Reproduce.o 

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

Что я могу сделать, чтобы получить возможность отладки приложений расширения?

Версии пакетов, которые я использовал: yocto 2.0.1, gcc 5.2.0, gdb 7.9.1, boost 1.58.

ответ

2

Но когда я пытаюсь отладить мое приложение с помощью GDB, я получаю это сообщение

Это говорит об ошибке в GDB. Ваша версия: 7.9.1 составляет почти 2 года. Ваш первый шаг должен состоять в том, чтобы попробовать более новую версию GDB.

Одна разница между «под GDB» и «native» выполнением заключается в том, что GDB отключает ASLR.

Перед запуском программы вы можете попробовать (gdb) set disable-randomization off. Но, учитывая описанные вами симптомы, я сомневаюсь, что это имеет какое-либо отношение к проблеме.

+0

@Employed_Russian, спасибо за ответ! 'set disable-randomization off' мне не помог, поэтому я попробую новую версию GDB и сообщите о результатах. –

+0

@Employed_Russian, вы были предельно правы! После обновления GDB до 7.11.1 моя проблема исчезла. Большое спасибо! –

Смежные вопросы