Je reçois une erreur agaçante chaque fois que gdb intercepte une exception. J’ai couru le programme d’exemple suivant
#include 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 grave, car je reçois les informations dont j’ai besoin, cela me dérange …
Est-ce que quelqu’un sait 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, lancez sudo apt install libc6-dbg
.
2) téléchargez le code source correspondant à la version installée de la bibliothèque C.
Commencez par créer un répertoire n’importe où. J’utiliserai /opt/src
ici. Ensuite, procédez 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, lancez gdb, lancez votre programme jusqu’à ce qu’il s’arrête, et à l’invite de gdb, procédez comme suit:
(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 se trouve dans un répertoire différent de celui où nous l’avons mis. Il y a deux façons de résoudre ce problème:
a) déplacez ou utilisez un lien symbolique pour que le code source soit (ou semble être) dans /build/glibc-KM3i_a/glibc-2.23
.
b) indiquez à gdb comment remplacer le chemin correct du répertoire source:
(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);