2013-07-29 2 views
7

Я, мой настоящий скрипт gdb, анализируя основной файл, я пытаюсь разыменовать указатель и получить «Ошибка в исходном файле команды: не удается получить доступ к памяти по адресу», а затем останавливается мой скрипт gdb. То, что я хочу, это просто выполнить скрипт gdb без остановки. Является ли это возможным?gdb останавливается в командном файле, если есть ошибка. Как продолжить, несмотря на ошибку?

Это тестовая программа и тестовый скрипт gdb, который демонстрирует мою проблему. В этой ситуации указатель имеет значение NULL, но в реальной ситуации указатель будет иметь недействительное недопустимое значение.

Это тестовая программа C:

#include <stdio.h> 
struct my_struct { 
    int v1; 
    int v2; 
}; 

int main() 
{ 
    my_struct *p; 
    printf("%d %d\n", p->v1, p->v2); 
    return 0; 
} 

Это тест GDB сценарий:

>cat analyze.gdb 
p p->v1 
q 

И это демонстрация проблемы (что я хочу от GDB здесь, чтобы получить эту ошибку сообщение и затем процесс quit команды):

>gdb -silent a.out ./core.22384 -x ./analyze.gdb 
Reading symbols from /a.out...done. 
[New Thread 22384] 
Core was generated by `./a.out'. 
Program terminated with signal 11, Segmentation fault. 
#0 0x0000000000400598 in main() at main.cpp:11 
11  printf("%d %d\n", p->v1, p->v2); 
./analyze.gdb:1: Error in sourced command file: 
Cannot access memory at address 0x0 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.x86_64 


Обновление
Благодаря Тому. Это GDB сценарий, который обрабатывает эту проблему:

Вот как это работает:

>gdb -silent ./a.out -x ./analyze.v2.gdb -c ./core.15045 
Reading symbols from /import/home/a.out...done. 
[New Thread 15045] 
Core was generated by `./a.out'. 
Program terminated with signal 11, Segmentation fault. 
#0 0x0000000000400598 in main() at main.cpp:11 
11  printf("%d %d\n", p->v1, p->v2); 
$1 = "Executing command: p p" 
$2 = (my_struct *) 0x0 
$3 = "Executing command: p p->v1" 
$4 = "ERROR: p p->v1" 
$5 = "Executing command: quit" 

ответ

4

Командный язык gdb не имеет возможности игнорировать ошибку при обработке команды.

Это легко сделать, если ваш gdb был построен с расширением Python. Найдите сценарий «игнорировать-ошибки». При этом, вы можете:

(GDB) игнорируемых ошибок печати * Foo

... и любые ошибки из печати будут показаны, но не прервет остальную часть вашего сценария.

+0

Благодарим вас за советы.Мне не удалось использовать 'ignore-errors', так как я получаю' Undefined command: "ignore-errors" ', но я создал подобную команду, и я работал. –

+0

Да, вам пришлось его искать. http://sourceware.org/ml/gdb/2010-06/msg00100.html –

+0

Позвольте мне объяснить. В gdb на моем сервере есть ignore-errors.py, но я пока не знаю, как его использовать. Простое использование 'ignore-errors print p' не работает. Тем не менее я использовал идею в ignore-errors.py и создал свои собственные «my_ignore_errors». Вы можете увидеть это в моем обновленном вопросе. –

0

Я не думаю, что это возможно, так как выполнение полагается на указатель. Однако вы могли бы назначить новое значение указателю, когда вы нажмете эту ошибку, например. set yourPointer = <another object of the same type>. Затем ваша программа может использовать разыменованное значение.

1

Вы также можете сделать это:

gdb a.out < analyze.v2.gdb 

Это будет выполнять команды в analyze.v2.gdb построчно, даже если произошла ошибка.

1

Если вы просто хотите, чтобы выйти, если происходит какая-либо ошибка, вы можете использовать -batch gdb option:

работать в пакетном режиме. Выйдите со статусом 0 после обработки всей команды файлов, указанных в '-x' (и все команды из файлов инициализации, , если они не заблокированы с '-n'). Выход с ненулевым статусом, если при выполнении команд GDB в командных файлах возникает ошибка . [...]