LINUX.ORG.RU

отладка до победного

 


1

2

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

★★★

Если валится с сегфолтом, убирай точку останова и запускай программу. При сегфолте gdb автоматом выдаст тебе данные

router ★★★★★
()
Ответ на: комментарий от batbko

Нет, это не сегфолт точно, отладка ядра на qemu.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

И в меню gdb после падения я увижу connection closed ( или как-то так), и все.

Мы точно про один и тот же gdb говорим? А ты пробовал? Ты получишь сообщение, что программа получила сигнал SIGSEGV. Вот тут-то и надо дать команду bt

Torvus
()
(gdb) set $i=0
(gdb) display/i $pc
1: x/i $pc
=> 0x7f0576 <main(int, char**)+15>:	mov    -0x10(%rbp),%rdx
(gdb) while $i < 5
 >si
 >set $i=$i+1
 >end
0x00000000007f057d	1771	  return v8::Shell::Main(argc, argv);
1: x/i $pc
=> 0x7f057d <main(int, char**)+22>:	mov    %rdx,%rsi
0x00000000007f0580	1771	  return v8::Shell::Main(argc, argv);
1: x/i $pc
=> 0x7f0580 <main(int, char**)+25>:	mov    %eax,%edi
0x00000000007f0582	1771	  return v8::Shell::Main(argc, argv);
1: x/i $pc
=> 0x7f0582 <main(int, char**)+27>:	
    callq  0x7f012c <v8::Shell::Main(int, char**)>
v8::Shell::Main (argc=0, argv=0x7fffffffdd30) at ../src/d8.cc:1670
1670	int Shell::Main(int argc, char* argv[]) {
1: x/i $pc
=> 0x7f012c <v8::Shell::Main(int, char**)>:	push   %rbp
0x00000000007f012d	1670	int Shell::Main(int argc, char* argv[]) {
1: x/i $pc
=> 0x7f012d <v8::Shell::Main(int, char**)+1>:	mov    %rsp,%rbp
(gdb) 

Сколько щелкать выбираете сами.

io ★★
()
Ответ на: комментарий от LIKAN

Читал, просто отдельные командочки.

Из этих «командочек» можно писать скрипты.

Тут что-то вроде скрипта нужно.

В мане по свежим gdb есть руководство по скриптингу на Python.

https://sourceware.org/gdb/onlinedocs/gdb/

Главы 22 и 23.

tailgunner ★★★★★
()
Ответ на: комментарий от Torvus

Нет, не получаю, я ж говорю, сама программа запущена на qemu, отладка удаленная. Программа падает таким образом, что кладет qemu

./launch.sh: line 1:  1043 Аварийный останов         (core dumped) qemu-system-arm -s -S -m 1024M -M vexpress-a15 -nographic -kernel u-boot -sd flash.img
Соответсвенно в qemu я вижу следующее
(gdb) continue
Continuing.
Remote connection closed

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

может, я что-то не понимаю, но ты на гостевой системе настрой, чтобы корка сохранялась в файл, а потом её, post-mortem, так сказать изучи, не?

aol ★★★★★
()
Ответ на: комментарий от io

Спасибо, это именно то, что нужно, но остается несколько впросов Я сделал следующим образом

(gdb) set $i=0
(gdb) while $i < 5
 >next
 >set $i=$i+1
 >end
Так отображается код на С, но тут один маленький минус, каждый раз, когда экран заполняется кодом, нужно жать Enter, но это мелочи жизни. Хуже то, что отладка заканчивается вот этим
142	    iounmap(wugen_base);
144	    return 0;
145	}
0x0027a414 in ?? ()
Cannot find bounds of current function
Что это значит, и как с этим бороться?

LIKAN ★★★
() автор топика
Ответ на: комментарий от vertexua

Можно по подробнее пожалуйста. Когда я открываю целевой файл с помощью gdb, последней строкой я вижу

Reading symbols from /home/likan/versatile/xen/xen/xen-syms...done
Я так понимаю, что это значит, что скомпилен он с дебаговой инфой. Во-вторых, бинарник для арма, т е отладка идет с помощью qemu, валгринд это может? Да и если мне память не изменяет валгринд скорее для анализа использования памяти служи, а мне нужно просто узнать, какая команда вызывает падение.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Не уверен что это значит что инфа вкомпилена.

Valgrind умеет упасть со стектрейсом и ошибкой в стиле Invalid read of size 4 bytes at myapp.cpp:234 или ругаться ворнингами Execution flow depends on unitialized variable. Он много чего умеет. Не уверен насчет арма.

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Ну если в я gdb могу увидеть Си-шный код, то наверное вкомпилена.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

когда экран заполняется кодом, нужно жать Enter

set pagination off, ЕМНИП

false ★★★★★
()
Последнее исправление: false (всего исправлений: 1)
Ответ на: комментарий от LIKAN

Собственно говоря отлаживать при помощи gdb шагом arm иногда весьма затруднительно, впрочем это зависит от того какой вид точек останова используется для шага.

gdb в принципе способен отлаживать программы где только часть источников скомпилирована с отладкой. Однако при движении по n и s если попасть в подобную процедуру (или ассемблерный код, код не покрытый коррекной информацией), то возможны разнообразные сообщения и пропуск инструкций до попадания в код собранный под отладкой. Так как возможны еще эффекты связанные с оптимизацией, то сам предпочитаю в критических ситуациях именно si или ni - как-то надежнее. Заметим, что при проходе по скомпилированным под отладкой С-код тоже будет.

io ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.