44#include < string.h>
55
66#include < cinttypes>
7+ #include < sstream>
8+ #include < string>
79
810#include < lldb/API/SBExpressionOptions.h>
911
1012#include " src/error.h"
1113#include " src/llnode.h"
1214#include " src/llscan.h"
1315#include " src/llv8.h"
16+ #include " src/node-inl.h"
1417
1518namespace llnode {
1619
@@ -245,6 +248,100 @@ bool ListCmd::DoExecute(SBDebugger d, char** cmd,
245248 return true ;
246249}
247250
251+ bool WorkqueueCmd::DoExecute (SBDebugger d, char ** cmd,
252+ SBCommandReturnObject& result) {
253+ SBTarget target = d.GetSelectedTarget ();
254+ SBThread thread = target.GetProcess ().GetSelectedThread ();
255+ if (!thread.IsValid ()) {
256+ result.SetError (" No valid process, please start something\n " );
257+ return false ;
258+ }
259+
260+ std::string result_message;
261+ Error err;
262+
263+ llv8_->Load (target);
264+ node_->Load (target);
265+
266+ node::Environment env = node::Environment::GetCurrent (node_, err);
267+ if (err.Fail ()) {
268+ result.SetError (err.GetMessage ());
269+ return false ;
270+ }
271+
272+ result_message = GetResultMessage (&env, err);
273+ if (err.Fail ()) {
274+ result.SetError (err.GetMessage ());
275+ return false ;
276+ }
277+
278+ result.Printf (" %s" , result_message.c_str ());
279+ return true ;
280+ }
281+
282+ std::string GetActiveHandlesCmd::GetResultMessage (node::Environment* env,
283+ Error& err) {
284+ int active_handles = 0 ;
285+ v8::Value::InspectOptions inspect_options;
286+ inspect_options.detailed = true ;
287+ std::ostringstream result_message;
288+
289+ for (auto w : env->handle_wrap_queue ()) {
290+ addr_t persistent = w.Persistent (err);
291+ if (err.Fail ()) break ;
292+ if (persistent == 0 ) continue ;
293+
294+ addr_t raw_object = w.Object (err);
295+ if (err.Fail ()) break ;
296+
297+ v8::JSObject v8_object (llv8 (), raw_object);
298+ std::string res = v8_object.Inspect (&inspect_options, err);
299+ if (err.Fail ()) {
300+ Error::PrintInDebugMode (" Failed to load object at address %" PRIx64,
301+ raw_object);
302+ break ;
303+ }
304+
305+ active_handles++;
306+ result_message << res.c_str () << std::endl;
307+ }
308+
309+ result_message << " Total: " << active_handles << std::endl;
310+ return result_message.str ();
311+ }
312+
313+
314+ std::string GetActiveRequestsCmd::GetResultMessage (node::Environment* env,
315+ Error& err) {
316+ int active_requests = 0 ;
317+ v8::Value::InspectOptions inspect_options;
318+ inspect_options.detailed = true ;
319+ std::ostringstream result_message;
320+
321+ for (auto w : env->req_wrap_queue ()) {
322+ addr_t persistent = w.Persistent (err);
323+ if (err.Fail ()) break ;
324+ if (persistent == 0 ) continue ;
325+
326+ addr_t raw_object = w.Object (err);
327+ if (err.Fail ()) break ;
328+
329+ v8::JSObject v8_object (llv8 (), raw_object);
330+ std::string res = v8_object.Inspect (&inspect_options, err);
331+ if (err.Fail ()) {
332+ Error::PrintInDebugMode (" Failed to load object at address %" PRIx64,
333+ raw_object);
334+ break ;
335+ }
336+
337+ active_requests++;
338+ result_message << res.c_str () << std::endl;
339+ }
340+
341+ result_message << " Total: " << active_requests << std::endl;
342+ return result_message.str ();
343+ }
344+
248345
249346void InitDebugMode () {
250347 bool is_debug_mode = false ;
@@ -264,6 +361,7 @@ bool PluginInitialize(SBDebugger d) {
264361 llnode::InitDebugMode ();
265362
266363 static llnode::v8::LLV8 llv8;
364+ static llnode::node::Node node (&llv8);
267365 static llnode::LLScan llscan = llnode::LLScan (&llv8);
268366
269367 SBCommandInterpreter interpreter = d.GetCommandInterpreter ();
@@ -349,6 +447,16 @@ bool PluginInitialize(SBDebugger d) {
349447 " JavaScript string value\n "
350448 " \n " );
351449
450+ v8.AddCommand (" getactivehandles" ,
451+ new llnode::GetActiveHandlesCmd (&llv8, &node),
452+ " Print all pending handles in the queue. Equivalent to running "
453+ " process._getActiveHandles() on the living process.\n " );
454+
455+ v8.AddCommand (
456+ " getactiverequests" , new llnode::GetActiveRequestsCmd (&llv8, &node),
457+ " Print all pending requests in the queue. Equivalent to "
458+ " running process._getActiveRequests() on the living process.\n " );
459+
352460 return true ;
353461}
354462
0 commit comments