2017-02-15 1 views
2

I compilé de façon croisée l'application, qui utilise la bibliothèque boost :: asio, et testé sur mon système cible. Cela fonctionne correctement. Mais lorsque je tente de déboguer mon application avec gdb, je reçois ce message dans gdb-console:Segmentation fault uniquement pendant le débogage 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) 

Le résultat est le même pour le débogage à distance et natif, et pour plusieurs autres bibliothèques Boost (mais pas pour tous) . Après avoir recherché toute information, cela pourrait être utile, j'ai trouvé un problème similaire dans ce document (p.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 Comme indiqué dans le document, le problème peut être causé par "l'instanciation statique dans les méthodes C++ implicitement implémentées" et est connecté à la glibc . J'ai donc essayé de reproduire ce bug par cette approche avec le code:

#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; 
} 

Ce programme fonctionne correctement, mais dans le débogage échoue avec la même erreur SIGSEGV.

Pour résoudre assez de réécrire la classe AClass ainsi:

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

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

Les drapeaux de compilation:

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 

Je suppose que dans certaines bibliothèques boost sont utilisées instanciation statique similaire, parce que les symptômes sont exactement les mêmes.

Que puis-je faire pour recevoir la possibilité de mise au point des applications de boost?

Les versions des paquets que j'ai utilisé: yocto 2.0.1, gcc 5.2.0, 7.9.1 gdb, stimuler 1,58.

Répondre

2

Mais quand j'essaie de déboguer mon application avec gdb, je reçois ce message

Cela suggère un bogue dans GDB. Votre version: 7.9.1 a presque 2 ans. Votre première étape devrait être d'essayer une version plus récente de la BDG. Une différence entre l'exécution "sous GDB" et "native" est que GDB désactive ASLR.

Vous pouvez essayer (gdb) set disable-randomization off avant d'exécuter le programme. Mais compte tenu des symptômes que vous avez décrits, je doute que cela ait quelque chose à voir avec le problème.

+0

@Employed_Russian, merci pour la réponse! 'set disable-randomization off' ne m'a pas aidé, donc je vais essayer une version plus récente de GDB et rendre compte des résultats. –

+0

@Employed_Russian, vous étiez très bien! Après la mise à jour de GDB en 7.11.1, mon problème a disparu. Merci beaucoup! –