[Lldb-commits] [PATCH] D79646: [Reproducers] Serialize process arguments in ProcessInfo

Jonas Devlieghere via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Fri May 8 13:26:06 PDT 2020


JDevlieghere created this revision.
JDevlieghere added reviewers: labath, teemperor, LLDB.

While debugging why `TestProcessList.py` failed during passive replay, I remembered that we don't serialize the arguments for ProcessInfo. This is necessary to make the test pass and to make `platform process list -v` behave the same during capture and replay.

  $ ./bin/lldb --capture
  (lldb) platform process list -v
  303 matching processes were found on "host"
  PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                         ARGUMENTS
  ====== ====== ========== ========== ========== ========== ============================== ============================
  40118  40116  jonas      staff      jonas      staff      x86_64-apple-macosx             -fish
  40116  2502   jonas      staff      jonas      staff      x86_64-apple-macosx             fish -c reattach-to-user-namespace -l fish
  ...

  $./bin/lldb --replay /var/folders/n4/g9s84l4125s3x9fqjjmncxzh0000gn/T/reproducer-71d635
  (lldb) platform process list -v
  303 matching processes were found on "host"
  PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                         ARGUMENTS
  ====== ====== ========== ========== ========== ========== ============================== ============================
  40118  40116  jonas      staff      jonas      staff      x86_64-apple-macosx
  40116  2502   jonas      staff      jonas      staff      x86_64-apple-macosx


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D79646

Files:
  lldb/include/lldb/Utility/Args.h
  lldb/source/Utility/Args.cpp
  lldb/source/Utility/ProcessInfo.cpp
  lldb/test/Shell/Reproducer/TestProcessList.test


Index: lldb/test/Shell/Reproducer/TestProcessList.test
===================================================================
--- /dev/null
+++ lldb/test/Shell/Reproducer/TestProcessList.test
@@ -0,0 +1,21 @@
+# UNSUPPORTED: system-freebsd
+
+# Test that ProcessInfo is correctly serialized by comparing the output of
+# 'platform process list -v' during capture and replay. The test assumes that
+# there's at least two processes.
+
+# RUN: %lldb -x -b -o 'platform process list -v' -o 'reproducer generate' --capture --capture-path %t.repro > %t.log
+# RUN: %lldb --replay %t.repro >> %t.log
+# RUN: cat %t.log | FileCheck %s
+
+# CHECK: [[PROCS:[0-9]+]] matching processes were found
+# CHECK: PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                         ARGUMENTS
+# CHECK-NEXT: ====== ====== ========== ========== ========== ========== ============================== ============================
+# CHECK-NEXT: [[PID0:[0-9]+]] [[PROC0:.*]]
+# CHECK-NEXT: [[PID1:[0-9]+]] [[PROC1:.*]]
+# CHECK: Reproducer written to
+# CHECK: [[PROCS]] matching processes were found
+# CHECK: PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                         ARGUMENTS
+# CHECK-NEXT: ====== ====== ========== ========== ========== ========== ============================== ============================
+# CHECK-NEXT: [[PID0]] [[PROC0]]
+# CHECK-NEXT: [[PID1]] [[PROC1]]
Index: lldb/source/Utility/ProcessInfo.cpp
===================================================================
--- lldb/source/Utility/ProcessInfo.cpp
+++ lldb/source/Utility/ProcessInfo.cpp
@@ -337,6 +337,7 @@
     IO &io, ProcessInstanceInfo &Info) {
   io.mapRequired("executable", Info.m_executable);
   io.mapRequired("arg0", Info.m_arg0);
+  io.mapRequired("args", Info.m_arguments);
   io.mapRequired("arch", Info.m_arch);
   io.mapRequired("uid", Info.m_uid);
   io.mapRequired("gid", Info.m_gid);
Index: lldb/source/Utility/Args.cpp
===================================================================
--- lldb/source/Utility/Args.cpp
+++ lldb/source/Utility/Args.cpp
@@ -684,3 +684,16 @@
     m_suffix = std::string(original_args);
   }
 }
+
+void llvm::yaml::ScalarTraits<Args>::output(const Args &Val, void *,
+                                            llvm::raw_ostream &Out) {
+  std::string str;
+  Val.GetCommandString(str);
+  Out << str;
+}
+
+llvm::StringRef llvm::yaml::ScalarTraits<Args>::input(llvm::StringRef Scalar,
+                                                      void *, Args &Val) {
+  Val.SetCommandString(Scalar);
+  return {};
+}
Index: lldb/include/lldb/Utility/Args.h
===================================================================
--- lldb/include/lldb/Utility/Args.h
+++ lldb/include/lldb/Utility/Args.h
@@ -14,6 +14,7 @@
 #include "lldb/lldb-types.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/Support/YAMLTraits.h"
 #include <string>
 #include <utility>
 #include <vector>
@@ -373,4 +374,14 @@
 
 } // namespace lldb_private
 
+namespace llvm {
+namespace yaml {
+template <> struct ScalarTraits<lldb_private::Args> {
+  static void output(const lldb_private::Args &, void *, raw_ostream &);
+  static StringRef input(StringRef, void *, lldb_private::Args &);
+  static QuotingType mustQuote(StringRef S) { return QuotingType::Double; }
+};
+} // namespace yaml
+} // namespace llvm
+
 #endif // LLDB_UTILITY_ARGS_H


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79646.262935.patch
Type: text/x-patch
Size: 3407 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200508/28f59adb/attachment.bin>


More information about the lldb-commits mailing list