Advertisement
Guest User

Untitled

a guest
Jan 29th, 2020
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.90 KB | None | 0 0
  1. Débugger un programme ou une application :
  2.  
  3.  
  4. Pour permettre de trouver le problème rencontré il faut (dans l’idéal) créer une trace détaillée : source https://en.opensuse.org/openSUSE:Bugreport_application_crashed
  5.  
  6. Installer les paquets -debuginfo : exemple : https://en.opensuse.org/Package_repositories#Debug
  7. Debug
  8. Debuginfo packages. Advanced users only.
  9. Version: Tumbleweed http://download.opensuse.org/debug/tumbleweed/repo/oss/
  10. Version: Leap 15.1 http://download.opensuse.org/debug/distribution/leap/15.1/repo/oss/ and updates http://download.opensuse.org/debug/update/leap/15.1/oss/
  11. Version: Leap 15.0 http://download.opensuse.org/debug/distribution/leap/15.0/repo/oss/ and updates http://download.opensuse.org/debug/update/leap/15.0/oss/
  12. Version: Leap 42.3 http://download.opensuse.org/debug/distribution/leap/42.3/repo/oss/ and updates http://download.opensuse.org/debug/update/leap/42.3/oss/
  13.  
  14.  
  15. Utiliser GDB :
  16.  
  17. Le debugger Gnu s’appelle GDB, il sert à trouver des erreurs souvent liées à la corruption de la mémoire.
  18. On peut l’utiliser pour créer une trace du problème rencontré par le programme utilisé (/usr/bin/programme).
  19. Pour créer une trace d’un programme qui provoque des erreurs de segmentation quand il se lance il faut utiliser la commande suivante :
  20.  
  21. $ gdb /usr/bin/programme
  22. GNU gdb 6.5
  23. ...
  24. (gdb)
  25.  
  26. GDB est lancé. Si des paquets -debuginfo manquent gdb montrera quelque chose de similaire :
  27.  
  28. Missing separate debuginfo for /lib64/libm.so.6
  29. Try : zypper install -C "debuginfo(build-id)=35d35d9ce781be3a140a34242d998498615b021f"
  30. Missing separate debuginfo for /lib64/libpthread.so.0
  31. Try: zypper install -C "debuginfo(build-id)=522229c2dde70aaa8e4295ecb7b6643c810f758f"
  32. Missing separate debuginfo for /lib64/libc.so.6
  33. Try: zypper install -C "debuginfo(build-id)=c3e668c7a2e7ae513e801d34a968a43510b29b52"
  34.  
  35. Copier les commandes zypper dans un terminal pour installer les paquets manquants.
  36. Quitter Gdb et le relancer.
  37. Depuis gdb taper run et attendre que le programme plante (crash).
  38.  
  39. (gdb) run
  40. Starting program: /usr/bin/brokenprogram
  41.  
  42. Program received signal SIGSEGV, Segmentation fault.
  43. 0x08048394 in brokenfunc () at brokenprogram.c:4
  44. 4 *i = 2;
  45. (gdb)
  46.  
  47. Autre option : si le programme est lancé à la connection, est démarré par un script init ou autre chose similaire on peut récupérer le processus et continuer son exécution pour attendre que se produise l’erreur :
  48.  
  49. $ pidof brokenprogram
  50. 12345
  51. $ gdb /usr/bin/brokenprogram 12345
  52. (gdb) continue
  53. Continuing.
  54. Program received signal SIGSEGV, Segmentation fault.
  55. 0x08048394 in brokenfunc () at broken.c:4
  56. 4 *i = 2;
  57. (gdb)
  58.  
  59. Ci-dessus on est de retour au prompt de GDB :
  60. - Autoriser l’écriture de la sauvegarde : set logging on.
  61. - Puis créer la trace de l’erreur avec : thread apply all backtrace full.
  62.  
  63. (gdb) set logging on
  64. Copying output to gdb.txt.
  65. (gdb) thread apply all backtrace full
  66. [New Thread 0x7ffff6d0b700 (LWP 4520)]
  67.  
  68. Thread 2 (Thread 0x7ffff750c700 (LWP 4519)):
  69. #0 0x00007ffff7542849 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
  70. resultvar = 0
  71. pid = 4515
  72. selftid = 4519
  73. #1 0x00007ffff7543cd8 in __GI_abort () at abort.c:89
  74. save_stage = 2
  75. act = {__sigaction_handler = {sa_handler = 0x6466203030303030, sa_sigaction = 0x6466203030303030}, sa_mask = {__val = {3906931166148702266, 2314885530818459703, 2314885530818453536,
  76. 3395749441387372576, 7596498572764408172, 3330465998920576354, 7378697628689264499, 3256155514972955191, 7233967814408037943, 3255307721929404514, 3472891250476064880, 3616454703663034416,
  77. 2321666313920262688, 2314885530818453536, 2314885530818453536, 8096}}, sa_flags = 89, sa_restorer = 0x7ffff750bed0}
  78. sigs = {__val = {32, 0 <repeats 15 times>}}
  79. #2 0x00007ffff7581114 in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7ffff76770e0 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175
  80. ap = Template:Gp offset = 40, fp offset = 0, overflow arg area = 0x7ffff750bee0, reg save area = 0x7ffff750be70
  81. fd = 3
  82. on_2 = <optimized out>
  83. list = <optimized out>
  84. nlist = <optimized out>
  85. cp = <optimized out>
  86. written = <optimized out>
  87. #3 0x00007ffff758696e in malloc_printerr (action=3, str=0x7ffff767317b "free(): invalid pointer", ptr=<optimized out>) at malloc.c:4916
  88. buf = '0' <repeats 11 times>, "12345"
  89. cp = <optimized out>
  90. #4 0x0000000000400a88 in work (t=0x0) at brokenprogram.c:18
  91. i = 10
  92. tid = 0
  93. result = -4.943676956758269
  94. #5 0x00007ffff78c40db in start_thread (arg=0x7ffff750c700) at pthread_create.c:309
  95. __res = <optimized out>
  96. pd = 0x7ffff750c700
  97. now = <optimized out>
  98. unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140737342654208, 3582659488515194238, 1, 140737354125312, 0, 140737342654208, -3582675678410998402, -3582676406767878786}, mask_was_saved = 0}}, priv = {
  99. pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
  100. not_first_call = <optimized out>
  101. pagesize_m1 = <optimized out>
  102. pd = 0x7ffff750c700
  103. now = <optimized out>
  104. unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140737342654208, 3582659488515194238, 1, 140737354125312, 0, 140737342654208, -3582675678410998402, -3582676406767878786}, mask_was_saved = 0}}, priv = {
  105. pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
  106. not_first_call = <optimized out>
  107. pagesize_m1 = <optimized out>
  108. sp = <optimized out>
  109. freesize = <optimized out>
  110. __PRETTY_FUNCTION__ = "start_thread"
  111. #6 0x00007ffff75f47cd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
  112. No locals.
  113.  
  114. Thread 1 (Thread 0x7ffff7fe1700 (LWP 4515)):
  115. [...]
  116. (gdb)
  117.  
  118.  
  119. Quitter Gdb en tapant quit
  120. La sauvegarde sera créée dans le fichier gdb.txt du répertoire en cours d’utilisation.
  121.  
  122. Si le programme se plante uniquement avec un paramètre spécifique ( par exemple –crash, on doit ajouter ce paramètre à la commande run :
  123.  
  124. (gdb) run --crash
  125. Starting program: /usr/bin/brokenprogram --crash
  126.  
  127. Dmesg :
  128. Dmesg affiche ou contrôle le buffer du noyau. Il faut l’utiliser si on des soucis avec le noyau lui même, les applications liées au noyau (modules, démarrage à chaud)
  129.  
  130. Strace :
  131. Les programmes utilisent souvent des fichiers pour récupérer des information de configuration, accéder au matériel, ou écrire des sauvegardes.
  132. Parfois un programme essaie d’atteindre ces fichiers de façon erronée.
  133. Strace est un outil de diagnostic et de débogage qui peut aider.
  134. Strace retrace les appels systèmes, d’où son nom, ce qui inclus les appels utilisant la mémoire et les fichiers.
  135. Dans un cas simple Strace lance la commande spécifiée jusqu’à qu’elle se termine.
  136. Il intercepte et enregistre les appels systèmes qui sont effectués par un processus et les signaux reçus par ce processus. Le nom des appels système, les arguments et la valeur de retour sont envoyés sur l’erreur standard, ou dans le fichier spécifié par l’option -o.
  137.  
  138. Exemple pour la commande cat /dev/null :
  139. strace -f -ttt -o strace.log cat /dev/null
  140. Cela créée un fichier strace.log dans le répertoire en cours d’utilisation.
  141. Exemples :
  142. open("/dev/null", O_RDONLY) = 3
  143. Les erreurs (valeur de retour typique -1) fournissent le symbole errno, et l’erreur correspondante :
  144. open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)
  145.  
  146. Donc Strace est un bon moyen de débugger des applications qui se plantent au démarrage, ou se ferment lorsque l’on ouvre ou sauvegarde des fichiers.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement