Allow "Run in gdb" action to launch linux-baremetal builds in QEMU

This commit is contained in:
2026-07-26 17:50:10 +02:00
parent edaf9bd8ba
commit 2d624c725c
+81 -24
View File
@@ -33,6 +33,7 @@ my $local_db_conf = "$local_root/db.conf";
my $resultbrowser_port = '5000';
my $resultbrowser = 'resultbrowser.py';
my $qemu_gdb_port = '9000';
my $remote_root = '/home/lab/smchurla/Documents/failnix';
my $remote_builds_dir = "$remote_root/builds";
@@ -523,11 +524,44 @@ my %handlers = (
my $build_dir = "$local_builds_dir/$selected_build";
my $build_name = $selected_build =~ s/.*?_.*?_(.*?)_.*$/$1/r;
my $is_baremetal = $selected_build =~ /linux-baremetal$/;
my $is_wasm = $build_name eq 'aot' || $build_name eq 'interp';
say "$build_name";
system(
'gdb',
# Baremetal builds boot the iso in qemu and attach gdb
my $qemu_pid;
if ($is_baremetal) {
say "Forking...";
$qemu_pid = fork();
die "fork failed: $!\n" unless defined $qemu_pid;
if ( $qemu_pid == 0 ) {
# child -> qemu.
exec(
'qemu-system-i386',
'-drive',
"file=$build_dir/system.iso,media=cdrom",
'-boot',
'd',
'-m',
'32',
'-D',
"$local_root/qemu.log",
'-d',
"int,cpu_reset",
'-no-reboot',
'-no-shutdown',
'-S',
'-gdb',
"tcp::$qemu_gdb_port",
) or die "failed to exec qemu: $!\n";
}
}
# Shared gdb args
my @gdb_args = (
'--tui',
'-q',
"$build_dir/system.elf",
@@ -537,29 +571,52 @@ my %handlers = (
"set substitute-path 'build-$build_name' '$build_dir'",
'-ex',
"set substitute-path '/build/source/core' '$local_wamr/core'",
'-ex',
'break main',
'-ex',
'break fail_start_trace',
'-ex',
'break fail_stop_trace',
'-ex',
'break fail_marker_positive',
'-ex',
'break fail_marker_detected',
'-ex',
'break fail_marker_negative',
'-ex',
'break fail_marker_group1',
'-ex',
'break os_mmap',
'-ex',
'break wamr_malloc',
'-ex',
'break wamr_realloc',
'-ex',
'break wamr_free',
);
# Specific gdb args
if ($is_baremetal) {
push @gdb_args,
'-ex', "target remote localhost:$qemu_gdb_port",
'-ex', 'break os_main';
}
else {
push @gdb_args, '-ex', 'break main';
}
# Shared breakpoints
my @shared_breakpoints = (
'fail_start_trace', 'fail_stop_trace',
'fail_marker_positive', 'fail_marker_detected',
'fail_marker_negative',
);
# Breakpoints for native C
my @c_breakpoints = ();
# Breakpoints for Wasm
my @wasm_breakpoints = (
'fail_marker_group1',
# 'os_mmap',
# 'wamr_malloc',
# 'wamr_realloc',
# 'wamr_free',
);
my @breakpoints = (
@shared_breakpoints, $is_wasm ? @wasm_breakpoints : @c_breakpoints,
);
push @gdb_args, '-ex', "break $_" for @breakpoints;
# Autostart execution
push @gdb_args, '-ex', ( $is_baremetal ? 'continue' : 'run' );
system( 'gdb', @gdb_args );
if ($is_baremetal) {
say "Killing qemu with pid $qemu_pid...";
kill 'TERM', $qemu_pid;
waitpid( $qemu_pid, 0 );
}
},
'30. Plot Results' => sub {