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?
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);