繁体   English   中英

Emacs-GDB有权中断而无需单步浏览所有文件

[英]Emacs - GDB trace right to interrupt without stepping through all files

我正在研究Pintos OS项目。 我收到此消息:

Page fault at 0xbfffefe0: not present error writing page in user context.

Pintos OS项目的问题在于,它不会简单地告诉导致异常的行和方法。

我知道如何使用断点/监视点等,但是有没有办法直接通过它而无需逐行处理整个流程和所有OS文件,以便我可以跳入引起异常的行并将断点放在那里? 我查看了GDB命令,但没有找到任何东西。

当我调试该项目时,我必须遍历整个程序,直到发现该错误/异常非常耗时。 可能有一种更快的方法。

谢谢。 整个痕迹:

nestilll@vdebian:~/Class/pintos/proj-3-bhling-nestilll-nsren/src/vm/build$ pintos -v -k -T 60 --qemu --gdb  --filesys-size=2 -p tests/vm/pt-grow-pusha -a pt-grow-pusha --swap-size=4 -- -q  -f run pt-grow-pusha
Use of literal control characters in variable names is deprecated at /home/nestilll/Class/pintos/src/utils/pintos line 909.
Prototype mismatch: sub main::SIGVTALRM () vs none at /home/nestilll/Class/pintos/src/utils/pintos line 933.
Constant subroutine SIGVTALRM redefined at /home/nestilll/Class/pintos/src/utils/pintos line 925.
warning: disabling timeout with --gdb
Copying tests/vm/pt-grow-pusha to scratch partition...
qemu -hda /tmp/N2JbACdqyV.dsk -m 4 -net none -nographic -s -S
PiLo hda1
Loading............
Kernel command line: -q -f extract run pt-grow-pusha
Pintos booting with 4,088 kB RAM...
382 pages available in kernel pool.
382 pages available in user pool.
Calibrating timer...  419,020,800 loops/s.
hda: 13,104 sectors (6 MB), model "QM00001", serial "QEMU HARDDISK"
hda1: 205 sectors (102 kB), Pintos OS kernel (20)
hda2: 4,096 sectors (2 MB), Pintos file system (21)
hda3: 98 sectors (49 kB), Pintos scratch (22)
hda4: 8,192 sectors (4 MB), Pintos swap (23)
filesys: using hda2
scratch: using hda3
swap: using hda4
Formatting file system...done.
Boot complete.
Extracting ustar archive from scratch device into file system...
Putting 'pt-grow-pusha' into the file system...
Erasing ustar archive...
Executing 'pt-grow-pusha':
(pt-grow-pusha) begin
Page fault at 0xbfffefe0: not present error writing page in user context.
pt-grow-pusha: dying due to interrupt 0x0e (#PF Page-Fault Exception).
Interrupt 0x0e (#PF Page-Fault Exception) at eip=0x804809c
 cr2=bfffefe0 error=00000006
 eax=bfffff8c ebx=00000000 ecx=0000000e edx=00000027
 esi=00000000 edi=00000000 esp=bffff000 ebp=bfffffa8
 cs=001b ds=0023 es=0023 ss=0023
pt-grow-pusha: exit(-1)
Execution of 'pt-grow-pusha' complete.
Timer: 71 ticks
Thread: 0 idle ticks, 63 kernel ticks, 8 user ticks
hda2 (filesys): 62 reads, 200 writes
hda3 (scratch): 97 reads, 2 writes
hda4 (swap): 0 reads, 0 writes
Console: 1359 characters output
Keyboard: 0 keys pressed
Exception: 1 page faults
Powering off...

使GDB调试器运行并在所需位置停止:

gdb filename <-启动调试会话br main <-在main()函数的第一行设置一个断点r <-运行直到达到该断点br filename.c:linenumber <-在所需的代码行c <-继续,直到出现第二个断点

如果调试器实际到达该位置,它将在文件中的所需位置停止,

当我调试该项目时,我必须遍历整个程序,直到找到导致错误/异常的原因,这是非常耗时的。 可能有一种更快的方法。

通常,您要做的就是在错误之前设置一个断点。 然后,您的程序将在没有干预的情况下全速运行,直到达到该点为止。

这里有几条皱纹。

首先,有时很难知道将断点放在哪里。 在这种情况下,我想我将寻找正在打印消息的代码,然后从那里开始工作。 有时,您必须在故障点停止,检查堆栈,进一步设置新的断点,然后重新运行程序。

然后是设置断点的机制。 一种简单的方法是按函数名称break my_function ,例如break my_function 另一种方法是使用文件名和行号,例如break my_file.c:73

最后,有时在遇到故障之前可以多次击中断点。 您可以使用忽略计数(请参阅help ignore )或条件断点(例如, break my_function if variable = 27 )来限制停止的次数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM