Я, мой настоящий скрипт 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"
Благодарим вас за советы.Мне не удалось использовать 'ignore-errors', так как я получаю' Undefined command: "ignore-errors" ', но я создал подобную команду, и я работал. –
Да, вам пришлось его искать. http://sourceware.org/ml/gdb/2010-06/msg00100.html –
Позвольте мне объяснить. В gdb на моем сервере есть ignore-errors.py, но я пока не знаю, как его использовать. Простое использование 'ignore-errors print p' не работает. Тем не менее я использовал идею в ignore-errors.py и создал свои собственные «my_ignore_errors». Вы можете увидеть это в моем обновленном вопросе. –