сбой симулятора gdb после «целевой sim-карты» «размер памяти sim-карты 4 МБ» «загрузка» «запуск»

#debugging #gdb #target #ebpf

Вопрос:

Мой план по отладке кода eBPF с использованием последней поддержки gdb. однако симулятор рухнет после того, как я запущу . поэтому я попробовал обычный код c «hello world», скомпилированный с опцией-g (gcc-g hello_wold.c), получил ту же проблему.

версия gdb : GNU gdb (GDB) 12.0.50.20211105-git

 Reading symbols from /root/hello_program/a.out...
(gdb) target sim
Connected to the simulator.
(gdb) sim memory-size 4Mb
(gdb) load
Loading section .interp, size 0x1c lma 238
Loading section .note.ABI-tag, size 0x20 lma 254
Loading section .note.gnu.build-id, size 0x24 lma 274
Loading section .gnu.hash, size 0x1c lma 298
Loading section .dynsym, size 0xc0 lma 2b8
Loading section .dynstr, size 0x96 lma 378
Loading section .gnu.version, size 0x10 lma 40e
Loading section .gnu.version_r, size 0x20 lma 420
Loading section .rela.dyn, size 0xd8 lma 440
Loading section .rela.plt, size 0x18 lma 518
Loading section .init, size 0x17 lma 530
Loading section .plt, size 0x20 lma 550
Loading section .plt.got, size 0x8 lma 570
Loading section .text, size 0x1c2 lma 580
Loading section .fini, size 0x9 lma 744
Loading section .rodata, size 0x10 lma 750
Loading section .eh_frame_hdr, size 0x3c lma 760
Loading section .eh_frame, size 0x10c lma 7a0
Loading section .init_array, size 0x8 lma 200dd8
Loading section .fini_array, size 0x8 lma 200de0
Loading section .jcr, size 0x8 lma 200de8
Loading section .dynamic, size 0x1e0 lma 200df0
Loading section .got, size 0x30 lma 200fd0
Loading section .got.plt, size 0x20 lma 201000
Loading section .data, size 0x10 lma 201020
Start address 580
Transfer rate: 17760 bits in <1 sec.
(gdb) run
Starting program: /root/hello_program/a.out 


Fatal signal: Aborted
----- Backtrace -----
0x55ffda5588a7 gdb_internal_backtrace_1
    /root/binutils-gdb/gdb/bt-utils.c:121
0x55ffda5588a7 _Z22gdb_internal_backtracev
    /root/binutils-gdb/gdb/bt-utils.c:164
0x55ffda6506cd handle_fatal_signal
    /root/binutils-gdb/gdb/event-top.c:896
0x7f89e035905f ???
    /build/glibc-77giwP/glibc-2.24/signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
0x7f89e0358fff __GI_raise
    ../sysdeps/unix/sysv/linux/raise.c:51
0x7f89e035a429 __GI_abort
    /build/glibc-77giwP/glibc-2.24/stdlib/abort.c:89
0x55ffda8e2728 sim_engine_invalid_insn
    /root/binutils-gdb/sim/bpf/traps.c:37
0x55ffda8da83d execute
    /root/binutils-gdb/sim/bpf/mloop-le.c:119

 

для кода bpf, который я скомпилировал с помощью ( clang -target bpf -g -O2 -c hello_world.c)

привет, мир, код bpf

 #include <linux/bpf.h>
#include "bpf_helpers.h"
#include <stdlib.h>
#include <stdio.h>

int bpf_prog(void *ctx) {
    
    char buf[] = "Hello World!n";
    bpf_trace_printk(buf, sizeof(buf)); 
    bpf_trace_printk(buf, sizeof(buf)); 
    bpf_trace_printk(buf, sizeof(buf)); 
    bpf_trace_printk(buf, sizeof(buf));
            
    return 0;

}


 

Ошибка

 Type "apropos word" to search for commands related to "word"...
Reading symbols from /root/ebpf_test/hello_world.o...
(No debugging symbols found in /root/ebpf_test/hello_world.o)
(gdb) target sim
Connected to the simulator.
(gdb) sim memory-size 4Mb
(gdb) load
Loading section .text, size 0x28 lma 0
Loading section .rodata.str1.1, size 0xd lma 0
Start address 0
Transfer rate: 424 bits in <1 sec.
(gdb) run
Starting program: /root/ebpf_test/hello_world.o 


Fatal signal: Aborted
----- Backtrace -----
0x562154f4a63b gdb_internal_backtrace_1
    /root/binutils-gdb/gdb/bt-utils.c:121
0x562154f4a63b _Z22gdb_internal_backtracev
    /root/binutils-gdb/gdb/bt-utils.c:164
0x56215504d2ba handle_fatal_signal
    /root/binutils-gdb/gdb/event-top.c:896
0x7f6f1a85503f ???
0x7f6f1a854fb7 ???
0x7f6f1a856920 ???
0x5621552fb9f8 sim_engine_invalid_insn
    /root/binutils-gdb/sim/bpf/traps.c:37
0x5621552f3aaa execute
    /root/binutils-gdb/sim/bpf/mloop-le.c:119
0x5621552f3aaa bpfbf_ebpfle_engine_run_full
    /root/binutils-gdb/sim/bpf/mloop-le.c:222
0x5621552ddee4 engine_run_1

 

то же самое происходит, когда я пытаюсь отладить программу ebpf. мы будем признательны за любую помощь, чтобы понять, с чего начать устранение проблемы.

Спасибо

Ответ №1:

Глядя на количество разделов, загруженных GDB, я не верю, что ваш объектный файл был скомпилирован как байт-код eBPF. Была gcc -g hello_world.c ли команда, которую вы использовали для ее создания? Это позволит скомпилировать инструкции из вашей архитектуры хоста, скорее всего, x86_64.

Компиляция в eBPF

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

 $ clang -target bpf -g -O2 -c hello_world.c
 

Это приведет к созданию объектного файла, содержащего инструкции eBPF. Обратите внимание, что я обычно добавляю -Wall и -o hello_world.o для отображения потенциальных предупреждений и для названия выходного файла. Полученный объектный файл должен работать в gdb, при условии, что у вас есть последняя версия с поддержкой eBPF (см. Здесь в противном случае).

Если вас интересует конкретный набор инструкций eBPF (если вы начинаете, то, вероятно, нет), вы можете указать его, скомпилировав вместо этого в два этапа и передав соответствующую опцию через -mcpu опцию для llc :

 $ clang -g -O2 -Wall -emit-llvm -c hello_world.c -o - | 
    llc -march=bpf -mcpu=probe -filetype=obj -o hello_world.o
 

Смотрите также этот ресурс для получения подробной информации и компиляции в сборку и из нее.

Комментарии:

1. Большое вам спасибо за ответ. Я действительно начал пытаться заставить его работать после того, как увидел ваши шаги в твиттере. если я скомпилирую с помощью «-target bpf», gdb скажет «В … не найдено отладочных символов». удаление этой опции заставит gdb увидеть отладочные символы. я попытался скомпилировать с lang, как вы сказали, и все равно получил тот же сбой после того, как я «запустил», что именно говорит об ошибке ? должен ли gdb рухнуть вместо изящного выхода ? Я отредактирую исходный вопрос, чтобы добавить код hello world

2. код bpf и ошибка были добавлены в исходный вопрос

3. похоже, первая проблема заключается в том, почему отладочные символы не генерируются с опцией «-target bpf»!

4. Странный. Символы отладки: они также должны быть у вас для eBPF, если вы компилируете с -g помощью опции (но, похоже, вы уже делаете это). Если только ваша версия лязга не слишком стара. Какая у вас версия? Что касается аварии: я тоже не думаю, что это должно произойти :). Возможно, стоит сообщить об этом сопровождающим. С моей стороны, при попытке запустить вашу программу eBPF (та же версия gdb и те же инструкции) я получаю еще одну ошибку ( core: 2 byte misaligned read to address 0x6f57206fdbc385b7 at 0x , ошибка?), Но без сбоя. Я все еще могу запускать некоторые другие программы, например, функция, которая просто возвращает 0, проходит нормально.

5. версия clang : версия clang 6.0.0-1ubuntu2 (теги/RELEASE_600/окончательный) Цель: x86_64-pc-linux-gnu Модель потока: posix InstalledDir: /usr/bin ………………………… можно ли было бы предоставить простой учебник, если он у вас уже есть : пример кода bpf на c как компилировать и как запускать как установить точку останова и распечатать регистры или указать мне на ресурс . я пытаюсь убедиться, что ошибки связаны с моей средой, а не с gdb (так как у вас уже были подобные ошибки)