2016-11-12 5 views
0

Я работаю над проектом OS Pintos. Я получаю сообщение:Emacs - GDB отслеживает право прерывать, не перешагивая все файлы

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

Проблема с проектом Pintos ОС является то, что он не будет просто сказать линию и метод, который вызвал исключение.

Я знаю, как использовать точки останова/точки наблюдения и т. Д., Но есть ли способ сделать шаг к нему, не проходя через поток WHOLE и ВСЕ ОС-файлы по строкам, чтобы я мог перейти в строку, вызвавшую исключение, и установить точку останова там? Я посмотрел на команды GDB, но ничего не нашел.

Когда я отлаживаю этот проект, я должен пройти через всю программу, пока не найду ту ошибку/исключение, которое очень трудоемко. Вероятно, существует более быстрый способ сделать это.

Спасибо. Всего след:

[email protected]:~/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... 

ответ

1

иметь GDB отладчик запустить и остановить в нужном месте:

< GDB имя_файла --start сеанс отладки уш главный < --set контрольную точку на первой строке функции main() г < - -run до этой точки останова не будет достигнут бр filename.c: номер_строки < --set другой точки останова на нужную строке коды с < является encuntered --continue до второй точки останова

Отладчик остановится в нужном месте в файле, если он когда-либо фактически туда попадет,

+0

Проблема в том, что я не знаю, где находится желаемое местоположение, пока я не начну с начала до конца до тех пор, пока не произойдет такое же исключение/ошибка. В других проектах, например, в простой Java, я могу прочитать трассировку стека для этого.В любом случае, чтобы сделать это для ОС Pintos? –

+0

'gdb' имеет команду для отображения трассировки стека. Вы можете использовать 'bt' или' backtrace', чтобы отобразить обратную трассировку стека. – user3629249

+0

Да, я тоже это использовал, не всегда полезно. Но спасибо за совет. –

0

Когда я отлаживать этот проект, я должен пройти через всю программу , пока я не нашел, что вызвало ошибку/исключение, которое очень много времени. Возможно, существует более быстрый способ сделать это.

Обычно вам нужно установить точку останова непосредственно перед ошибкой. Тогда ваша программа будет работать на полной скорости без вашего вмешательства, пока не достигнет этой точки.

Здесь несколько морщин.

Во-первых, иногда трудно определить, где поставить точку останова. В этом случае я предполагаю, что я буду искать код, который печатает сообщение, а затем откидывается назад. Иногда вам приходится останавливаться на точке отказа, проверять стек, устанавливать новую точку останова и повторно запускать программу.

Тогда есть механика настройки точки останова. Один простой способ - разбить по имени функции, например break my_function. Другим является использование имени файла и номера строки, например break my_file.c:73.

И, наконец, иногда точка останова может быть удалена много раз, прежде чем произойдет сбой. Вы можете использовать счетчики игнорирования (см. help ignore) или условные точки останова (например, break my_function if variable = 27), чтобы ограничить количество остановок.