2017-09-04 1 views
0

Linux Kernel: 4.13-RC7 x86_64de débogage du noyau: Gdb pas en mesure de définir des points d'arrêt et aucun effet de SIGINT pour ramener dans Debugging Session

Configuré Buildroot et Qemu pour le noyau Linux Debugging .

Lancement Qemu utilisant la commande suivante:

qemu-system-x86_64 -kernel linux-4.13-rc7/arch/x86/boot/bzImage -initrd buildroot-2017.02.5/output/images/rootfs.cpio -append "root=/dev/ram0 console=tty0 kgdboc=ttyS0,9600 kgdbwait" -chardev pty,id=pty -device isa-serial,chardev=pty

Maintenant, dans la fenêtre de terminal suivante, gdb de lancement et procéder suivantes commandes gdb:

`

gdb-peda$ file vmlinux 
Reading symbols from vmlinux...done. 
warning: File "/root/drive/linux-4.13-rc7/scripts/gdb/vmlinux-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load". 
To enable execution of this file add 
    add-auto-load-safe-path /root/drive/linux-4.13-rc7/scripts/gdb/vmlinux-gdb.py 
line to your configuration file "/root/.gdbinit". 
To completely disable this security protection add 
    set auto-load safe-path/
line to your configuration file "/root/.gdbinit". 
For more information about this security protection see the 
"Auto-loading safe path" section in the GDB manual. E.g., run from the shell: 
    info "(gdb)Auto-loading safe path" 
gdb-peda$ target remote /dev/pts/3 
Remote debugging using /dev/pts/3 
Warning: not running or target is remote 
0xffffffffbd6f65af in ??() 
gdb-peda$ b start_kernel 
Breakpoint 1 at 0xffffffff81f79ad7: file init/main.c, line 510. 
gdb-peda$ c 
Continuing. 
Warning: 
Cannot insert breakpoint 1. 
Cannot access memory at address 0xffffffff81f79ad7 

Command aborted. 
gdb-peda$ ` 

J'ai aussi essayé dans la machine Qemu:

echo "g" > /proc/sysrq-trigger. Mais rien ne s'est passé .

Également, essayé de définir des points d'arrêt matériels en utilisant hbreak sur start_kernel, mais rien ne s'est produit.

Répondre

0

Je compris la solution par le propre, je l'ai fait les choses suivantes pour obtenir une solution de travail:

  • Appliquer patch pour gdb recompiler puis avec le patch dans le fichier <$GDB_FOLDER>/gdb/remote.c.

GDB Patch pour redimensionner sa mémoire tampon interne: `

root# diff -u gdb-8\ \(1\).0/gdb/remote.c gdb-8.0/gdb/remote.c 

--- "gdb-8 (1).0/gdb/remote.c" 2017-06-04 21:24:54.000000000 +0530 
+++ gdb-8.0/gdb/remote.c 2017-09-05 23:27:46.487820345 +0530 
@@ -7583,7 +7583,27 @@ 

    /* Further sanity checks, with knowledge of the architecture. */ 
    if (buf_len > 2 * rsa->sizeof_g_packet) 
- error (_("Remote 'g' packet reply is too long: %s"), rs->buf); 
+ //error (_("Remote 'g' packet reply is too long: %s"), rs->buf); #patching 
+ { 
+  warning (_("Assuming long-mode change. [Remote 'g' packet reply is too long: %s]"), rs->buf); 
+  rsa->sizeof_g_packet = buf_len ; 
+ 
+  for (i = 0; i < gdbarch_num_regs (gdbarch); i++) 
+  { 
+   if (rsa->regs[i].pnum == -1) 
+   continue; 
+ 
+   if (rsa->regs[i].offset >= rsa->sizeof_g_packet) 
+   rsa->regs[i].in_g_packet = 0; 
+   else 
+   rsa->regs[i].in_g_packet = 1; 
+  } 
+ 
+  // HACKFIX: Make sure at least the lower half of EIP is set correctly, so the proper 
+  // breakpoint is recognized (and triggered). 
+  rsa->regs[8].offset = 16*8; 
+ } 
+ 

    /* Save the size of the packet sent to us by the target. It is used 
     as a heuristic when determining the max size of packets that the` 
  • Construire les RootFS minimales de Buildroot.

  • Lancez Qemu en suivant la commande et lancez gdb, puis chargez le fichier vmlinux.

  • Dans un terminal:

    root# qemu-system-x86_64 -kernel /root/drive/linux-4.13-rc7/arch/x86/boot/bzImage -initrd /root/drive/buildroot-2017.02.5/output/images/rootfs.cpio -S -s

  • Dans un autre terminal:

    gdb -q /root/drive/linux-4.13-rc7/vmlinux -ex "target remote localhost:1234"

point de pause fixé à start_kernel et continuer, il frappera automatiquement le point d'arrêt .