working lldb example

imgbot
Dmitry Sharshakov 3 years ago committed by Blaž Hrastnik
parent ae32159247
commit f92fb966c0

@ -57,7 +57,7 @@ pub async fn main() -> Result<()> {
"/tmp/cdebug/main.c".to_owned(), "/tmp/cdebug/main.c".to_owned(),
vec![SourceBreakpoint { vec![SourceBreakpoint {
line: 6, line: 6,
column: Some(4), column: Some(2),
condition: None, condition: None,
hit_condition: None, hit_condition: None,
log_message: None, log_message: None,
@ -82,7 +82,7 @@ pub async fn main() -> Result<()> {
let threads = client.threads().await?; let threads = client.threads().await?;
println!("threads: {:#?}", threads); println!("threads: {:#?}", threads);
let bt = client let bt = client
.stack_trace(threads[2].id) .stack_trace(threads[0].id)
.await .await
.expect("expected stack trace"); .expect("expected stack trace");
println!("stack trace: {:#?}", bt); println!("stack trace: {:#?}", bt);
@ -93,7 +93,7 @@ pub async fn main() -> Result<()> {
println!("scopes: {:#?}", scopes); println!("scopes: {:#?}", scopes);
println!( println!(
"vars: {:#?}", "vars: {:#?}",
client.variables(scopes[1].variables_reference).await client.variables(scopes[0].variables_reference).await
); );
let mut _in = String::new(); let mut _in = String::new();

@ -12,6 +12,7 @@ use std::sync::{
use std::{collections::HashMap, process::Stdio}; use std::{collections::HashMap, process::Stdio};
use tokio::{ use tokio::{
io::{AsyncBufRead, AsyncWrite, BufReader, BufWriter}, io::{AsyncBufRead, AsyncWrite, BufReader, BufWriter},
join,
net::TcpStream, net::TcpStream,
process::{Child, Command}, process::{Child, Command},
sync::{ sync::{
@ -449,7 +450,12 @@ impl Client {
self.request_counter.fetch_add(1, Ordering::Relaxed) self.request_counter.fetch_add(1, Ordering::Relaxed)
} }
async fn request(&self, command: String, arguments: Option<Value>) -> Result<Response> { async fn request(
&self,
command: String,
arguments: Option<Value>,
response: bool,
) -> Result<Option<Response>> {
let (callback_rx, mut callback_tx) = channel(1); let (callback_rx, mut callback_tx) = channel(1);
let req = Request { let req = Request {
@ -464,10 +470,11 @@ impl Client {
.send(req) .send(req)
.expect("Failed to send request to debugger"); .expect("Failed to send request to debugger");
callback_tx if response {
.recv() Ok(Some(callback_tx.recv().await.unwrap()?))
.await } else {
.expect("Failed to receive response") Ok(None)
}
} }
pub fn capabilities(&self) -> &DebuggerCapabilities { pub fn capabilities(&self) -> &DebuggerCapabilities {
@ -494,25 +501,25 @@ impl Client {
}; };
let response = self let response = self
.request("initialize".to_owned(), to_value(args).ok()) .request("initialize".to_owned(), to_value(args).ok(), true)
.await?; .await?
.unwrap();
self.capabilities = from_value(response.body.unwrap()).ok(); self.capabilities = from_value(response.body.unwrap()).ok();
Ok(()) Ok(())
} }
pub async fn disconnect(&mut self) -> Result<()> { pub async fn disconnect(&mut self) -> Result<()> {
self.request("disconnect".to_owned(), None).await?; self.request("disconnect".to_owned(), None, true).await?;
Ok(()) Ok(())
} }
pub async fn launch(&mut self, args: impl Serialize) -> Result<()> { pub async fn launch(&mut self, args: impl Serialize) -> Result<()> {
let mut initialized = self.listen_for_event("initialized".to_owned()).await; let mut initialized = self.listen_for_event("initialized".to_owned()).await;
self.request("launch".to_owned(), to_value(args).ok()) let res = self.request("launch".to_owned(), to_value(args).ok(), true);
.await?; let ev = initialized.recv();
join!(res, ev).0?;
initialized.recv().await;
Ok(()) Ok(())
} }
@ -520,10 +527,9 @@ impl Client {
pub async fn attach(&mut self, args: impl Serialize) -> Result<()> { pub async fn attach(&mut self, args: impl Serialize) -> Result<()> {
let mut initialized = self.listen_for_event("initialized".to_owned()).await; let mut initialized = self.listen_for_event("initialized".to_owned()).await;
self.request("attach".to_owned(), to_value(args).ok()) let res = self.request("attach".to_owned(), to_value(args).ok(), false);
.await?; let ev = initialized.recv();
join!(res, ev).0?;
initialized.recv().await;
Ok(()) Ok(())
} }
@ -549,15 +555,17 @@ impl Client {
}; };
let response = self let response = self
.request("setBreakpoints".to_owned(), to_value(args).ok()) .request("setBreakpoints".to_owned(), to_value(args).ok(), true)
.await?; .await?
.unwrap();
let body: Option<SetBreakpointsResponseBody> = from_value(response.body.unwrap()).ok(); let body: Option<SetBreakpointsResponseBody> = from_value(response.body.unwrap()).ok();
Ok(body.map(|b| b.breakpoints).unwrap()) Ok(body.map(|b| b.breakpoints).unwrap())
} }
pub async fn configuration_done(&mut self) -> Result<()> { pub async fn configuration_done(&mut self) -> Result<()> {
self.request("configurationDone".to_owned(), None).await?; self.request("configurationDone".to_owned(), None, true)
.await?;
Ok(()) Ok(())
} }
@ -565,8 +573,9 @@ impl Client {
let args = ContinueArguments { thread_id }; let args = ContinueArguments { thread_id };
let response = self let response = self
.request("continue".to_owned(), to_value(args).ok()) .request("continue".to_owned(), to_value(args).ok(), true)
.await?; .await?
.unwrap();
let body: Option<ContinueResponseBody> = from_value(response.body.unwrap()).ok(); let body: Option<ContinueResponseBody> = from_value(response.body.unwrap()).ok();
@ -585,8 +594,9 @@ impl Client {
}; };
let response = self let response = self
.request("stackTrace".to_owned(), to_value(args).ok()) .request("stackTrace".to_owned(), to_value(args).ok(), true)
.await?; .await?
.unwrap();
let body: StackTraceResponseBody = from_value(response.body.unwrap()).unwrap(); let body: StackTraceResponseBody = from_value(response.body.unwrap()).unwrap();
@ -594,7 +604,10 @@ impl Client {
} }
pub async fn threads(&mut self) -> Result<Vec<Thread>> { pub async fn threads(&mut self) -> Result<Vec<Thread>> {
let response = self.request("threads".to_owned(), None).await?; let response = self
.request("threads".to_owned(), None, true)
.await?
.unwrap();
let body: ThreadsResponseBody = from_value(response.body.unwrap()).unwrap(); let body: ThreadsResponseBody = from_value(response.body.unwrap()).unwrap();
@ -605,8 +618,9 @@ impl Client {
let args = ScopesArguments { frame_id }; let args = ScopesArguments { frame_id };
let response = self let response = self
.request("scopes".to_owned(), to_value(args).ok()) .request("scopes".to_owned(), to_value(args).ok(), true)
.await?; .await?
.unwrap();
let body: ScopesResponseBody = from_value(response.body.unwrap()).unwrap(); let body: ScopesResponseBody = from_value(response.body.unwrap()).unwrap();
@ -623,8 +637,9 @@ impl Client {
}; };
let response = self let response = self
.request("variables".to_owned(), to_value(args).ok()) .request("variables".to_owned(), to_value(args).ok(), true)
.await?; .await?
.unwrap();
let body: VariablesResponseBody = from_value(response.body.unwrap()).unwrap(); let body: VariablesResponseBody = from_value(response.body.unwrap()).unwrap();

Loading…
Cancel
Save