ANR: Improve parameter removal

Support removing multiple parameters since functions can
be defined inside function (lambdas are very common case).

Bug: 189881220
Test: manual ANR
Change-Id: I9c4ad139bcee09811cb7356ee48199b16483d971
diff --git a/runtime/native_stack_dump.cc b/runtime/native_stack_dump.cc
index 0dd13b7..00f6106 100644
--- a/runtime/native_stack_dump.cc
+++ b/runtime/native_stack_dump.cc
@@ -322,17 +322,17 @@
   return code <= pc && pc <= (code + code_size);
 }
 
-// Remove method parameters by finding matching parenthesis and removing that substring.
-std::string_view StripParameters(std::string_view name) {
-  if (name.empty() || *name.rbegin() != ')') {
-    return name;
-  }
+// Remove method parameters by finding matching top-level parenthesis and removing them.
+// Since functions can be defined inside functions, this can remove multiple substrings.
+std::string StripParameters(std::string name) {
+  size_t end = name.size();
   int nesting = 0;
   for (ssize_t i = name.size() - 1; i > 0; i--) {
-    if (name[i] == ')') {
-      nesting++;
-    } else if (name[i] == '(' && --nesting == 0) {
-      return name.substr(0, i);
+    if (name[i] == ')' && nesting++ == 0) {
+      end = i + 1;
+    }
+    if (name[i] == '(' && --nesting == 0) {
+      name = name.erase(i, end - i);
     }
   }
   return name;