1 use filecheck::{CheckerBuilder, NO_VARIABLES};
2 use std::env;
3 use std::io::Write;
4 use std::process::Command;
5 use tempfile::NamedTempFile;
6 use wasmtime::{Result, bail, format_err};
7
gdb_with_script(args: &[&str], script: &str) -> Result<String>8 fn gdb_with_script(args: &[&str], script: &str) -> Result<String> {
9 let lldb_path = env::var("GDB").unwrap_or("gdb".to_string());
10 let mut cmd = Command::new(&lldb_path);
11
12 cmd.arg("--batch");
13 let mut script_file = NamedTempFile::new()?;
14 script_file.write(script.as_bytes())?;
15 let script_path = script_file.path().to_str().unwrap();
16 cmd.args(&["-x", &script_path]);
17
18 cmd.arg("--args");
19
20 let mut me = std::env::current_exe().expect("current_exe specified");
21 me.pop(); // chop off the file name
22 me.pop(); // chop off `deps`
23 me.push("wasmtime");
24 cmd.arg(me);
25
26 cmd.args(args);
27
28 let output = cmd.output().expect("success");
29 if !output.status.success() {
30 bail!(
31 "failed to execute {:?}: {}",
32 cmd,
33 String::from_utf8_lossy(&output.stderr),
34 );
35 }
36 Ok(String::from_utf8(output.stdout)?)
37 }
38
check_gdb_output(output: &str, directives: &str) -> Result<()>39 fn check_gdb_output(output: &str, directives: &str) -> Result<()> {
40 let mut builder = CheckerBuilder::new();
41 builder
42 .text(directives)
43 .map_err(|e| format_err!("unable to build checker: {e:?}"))?;
44 let checker = builder.finish();
45 let check = checker
46 .explain(output, NO_VARIABLES)
47 .map_err(|e| format_err!("{e:?}"))?;
48 assert!(check.0, "didn't pass check {}", check.1);
49 Ok(())
50 }
51
52 #[test]
53 #[ignore]
test_debug_dwarf_gdb() -> Result<()>54 fn test_debug_dwarf_gdb() -> Result<()> {
55 let output = gdb_with_script(
56 &[
57 "-Ccache=n",
58 "-Ddebug-info",
59 "-Oopt-level=0",
60 "--invoke",
61 "fib",
62 test_programs_artifacts::DWARF_FIB_WASM,
63 "3",
64 ],
65 r#"set breakpoint pending on
66 b fib
67 r
68 info locals
69 c"#,
70 )?;
71
72 check_gdb_output(
73 &output,
74 r#"
75 check: Breakpoint 1 (fib) pending
76 check: hit Breakpoint 1
77 sameln: fib (n=3)
78 check: a = 0
79 check: b = 0
80 check: exited normally
81 "#,
82 )?;
83 Ok(())
84 }
85