web-dev-qa-db-fra.com

GDB se plaint de l'absence de raise.c

Je reçois une erreur ennuyeuse à chaque fois que gdb intercepte une exception. J'ai exécuté l'exemple de programme suivant

#include <stdexcept>

int main() {
  throw std::invalid_argument("");
  return 0;
}

Et le résultat de l'exécution de gdb est

terminate called after throwing an instance of 'std::invalid_argument'
  what():  

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

Ce n'est pas si mal que ça, car j'obtiens les informations dont j'ai besoin, ça me dérange ...

Quelqu'un sait-il comment résoudre ce problème?

11
ClausH

Pour effectuer le débogage complet du code source de la bibliothèque C sur Ubuntu, vous devez:

1) installez la version debuginfo de libc6.

Il est probablement déjà installé, mais dans le cas contraire, exécutez Sudo apt install libc6-dbg.

2) téléchargez le code source correspondant à la version installée de la bibliothèque C.

Créez d'abord un répertoire n'importe où - je vais utiliser /opt/src ici. Procédez ensuite comme suit:

Sudo apt install dpkg-dev
cd /opt/src
apt source libc6
find $PWD -maxdepth 1 -type d -name 'glibc*'

Rappelez-vous ce nom - ce sera quelque chose comme /opt/src/glibc-2.23

Maintenant, exécutez gdb, exécutez votre programme jusqu'à ce qu'il s'arrête, et à l'invite gdb, faites ceci:

(gdb) info source
Current source file is ../sysdeps/unix/sysv/linux/raise.c
Compilation directory is /build/glibc-KM3i_a/glibc-2.23/signal

Donc, gdb s'attend à ce que le code source soit dans un répertoire différent de celui où nous l'avons mis. Il existe deux façons de résoudre ce problème:

a) déplacer ou utiliser un lien symbolique pour que le code source soit (ou semble être) dans /build/glibc-KM3i_a/glibc-2.23.

b) indiquer à gdb comment remplacer le chemin d'accès du répertoire source correct:

  (gdb) set substitute-path /build/glibc-KM3i_a/glibc-2.23 /opt/src/glibc-2.23

Maintenant, revenez à votre cadre, et gdb devrait afficher la ligne de code source:

(gdb) frame 1
#1 0xb7e2fea9 in __GI_raise (sig=6) at ../sysdeps/unix/sysv/linux/raise.c:54
         return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig);
12
Mark Plotnick