Skip to content

[LLDB] Add integration test for libsanitizers trace collection #134323

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 7, 2025

Conversation

yln
Copy link
Collaborator

@yln yln commented Apr 3, 2025

Add integration test for libsanitizers trace collection (SanitizersAllocationTraces=all).

rdar://144244084

yln added 2 commits April 3, 2025 15:56
Add integration test for libsanitizers trace
collection (`SanitizersAllocationTraces=all`).

rdar://144244084
@llvmbot
Copy link
Member

llvmbot commented Apr 3, 2025

@llvm/pr-subscribers-lldb

Author: Julian Lettner (yln)

Changes

Add integration test for libsanitizers trace collection (SanitizersAllocationTraces=all).

rdar://144244084


Full diff: https://github.com/llvm/llvm-project/pull/134323.diff

3 Files Affected:

  • (modified) lldb/test/API/functionalities/asan/Makefile (+7-4)
  • (modified) lldb/test/API/functionalities/asan/TestMemoryHistory.py (+58-34)
  • (modified) lldb/test/API/functionalities/asan/TestReportData.py (+5-7)
diff --git a/lldb/test/API/functionalities/asan/Makefile b/lldb/test/API/functionalities/asan/Makefile
index d66696fed7078..eae5ca3e4626c 100644
--- a/lldb/test/API/functionalities/asan/Makefile
+++ b/lldb/test/API/functionalities/asan/Makefile
@@ -1,8 +1,11 @@
 C_SOURCES := main.c
-asan: CFLAGS_EXTRAS := -fsanitize=address -g -gcolumn-info
-asan: all
+compiler_rt-asan: CFLAGS_EXTRAS := -fsanitize=address -g -gcolumn-info
+compiler_rt-asan: all
 
-libsanitizers: CFLAGS_EXTRAS := -fsanitize=address -fsanitize-stable-abi -g -gcolumn-info
-libsanitizers: all
+libsanitizers-asan: CFLAGS_EXTRAS := -fsanitize=address -fsanitize-stable-abi -g -gcolumn-info
+libsanitizers-asan: all
+
+libsanitizers-traces: CFLAGS_EXTRAS := -g -gcolumn-info
+libsanitizers-traces: all
 
 include Makefile.rules
diff --git a/lldb/test/API/functionalities/asan/TestMemoryHistory.py b/lldb/test/API/functionalities/asan/TestMemoryHistory.py
index b04182a543719..894235481c440 100644
--- a/lldb/test/API/functionalities/asan/TestMemoryHistory.py
+++ b/lldb/test/API/functionalities/asan/TestMemoryHistory.py
@@ -15,17 +15,23 @@ class AsanTestCase(TestBase):
     @expectedFailureNetBSD
     @skipUnlessAddressSanitizer
     def test(self):
-        self.build(make_targets=["asan"])
+        self.build(make_targets=["compiler_rt-asan"])
         self.asan_tests()
 
-    @skipIf(oslist=no_match(["macosx"]))
-    @skipIf(bugnumber="rdar://144997976")
+    @skipUnlessDarwin
+    @skipIf(bugnumber="rdar://109913184&143590169")
     def test_libsanitizers_asan(self):
         try:
-            self.build(make_targets=["libsanitizers"])
+            self.build(make_targets=["libsanitizers-asan"])
         except BuildError as e:
             self.skipTest("failed to build with libsanitizers")
-        self.libsanitizer_tests()
+        self.libsanitizers_asan_tests()
+
+    @skipUnlessDarwin
+    @skipIf(macos_version=["<", "15.5"])
+    def test_libsanitizers_traces(self):
+        self.build(make_targets=["libsanitizers-traces"])
+        self.libsanitizers_traces_tests()
 
     def setUp(self):
         # Call super's setUp().
@@ -36,34 +42,61 @@ def setUp(self):
         self.line_breakpoint = line_number("main.c", "// break line")
 
     # Test line numbers: rdar://126237493
-    def libsanitizer_tests(self):
-        target = self.createTestTarget()
+    # for libsanitizers and remove `skip_line_numbers` parameter
+    def check_traces(self, skip_line_numbers):
+        self.expect(
+            "memory history 'pointer'",
+            substrs=[
+                "Memory deallocated by Thread",
+                "a.out`f2",
+                "main.c" if skip_line_numbers else f"main.c:{self.line_free}",
+                "Memory allocated by Thread",
+                "a.out`f1",
+                "main.c" if skip_line_numbers else f"main.c:{self.line_malloc}",
+            ],
+        )
+
+    def libsanitizers_traces_tests(self):
+        self.createTestTarget()
+
+        self.runCmd("env SanitizersAllocationTraces=all")
 
-        self.runCmd(
-            "env SanitizersAddress=1 MallocSanitizerZone=1 MallocSecureAllocator=0"
+        self.runCmd("breakpoint set -f main.c -l %d" % self.line_breakpoint)
+        self.runCmd("run")
+
+        # Stop on breakpoint, before report
+        self.expect(
+            "thread list",
+            STOPPED_DUE_TO_BREAKPOINT,
+            substrs=["stopped", "stop reason = breakpoint"],
         )
+        self.check_traces(skip_line_numbers=True)
+
+    def libsanitizers_asan_tests(self):
+        self.createTestTarget()
+
+        self.runCmd("env SanitizersAddress=1 MallocSanitizerZone=1")
 
+        self.runCmd("breakpoint set -f main.c -l %d" % self.line_breakpoint)
         self.runCmd("run")
 
-        # In libsanitizers, memory history is not supported until a report has been generated
+        # Stop on breakpoint, before report
         self.expect(
             "thread list",
-            "Process should be stopped due to ASan report",
-            substrs=["stopped", "stop reason = Use of deallocated memory"],
+            STOPPED_DUE_TO_BREAKPOINT,
+            substrs=["stopped", "stop reason = breakpoint"],
         )
+        self.check_traces(skip_line_numbers=True)
+
+        self.runCmd("continue")
 
-        # test the 'memory history' command
+        # Stop on report
         self.expect(
-            "memory history 'pointer'",
-            substrs=[
-                "Memory deallocated by Thread",
-                "a.out`f2",
-                "main.c",
-                "Memory allocated by Thread",
-                "a.out`f1",
-                "main.c",
-            ],
+            "thread list",
+            "Process should be stopped due to ASan report",
+            substrs=["stopped", "stop reason = Use of deallocated memory"],
         )
+        self.check_traces(skip_line_numbers=True)
 
         # do the same using SB API
         process = self.dbg.GetSelectedTarget().process
@@ -135,18 +168,7 @@ def asan_tests(self):
             substrs=["1 match found"],
         )
 
-        # test the 'memory history' command
-        self.expect(
-            "memory history 'pointer'",
-            substrs=[
-                "Memory deallocated by Thread",
-                "a.out`f2",
-                "main.c:%d" % self.line_free,
-                "Memory allocated by Thread",
-                "a.out`f1",
-                "main.c:%d" % self.line_malloc,
-            ],
-        )
+        self.check_traces()
 
         # do the same using SB API
         process = self.dbg.GetSelectedTarget().process
@@ -198,6 +220,8 @@ def asan_tests(self):
             substrs=["stopped", "stop reason = Use of deallocated memory"],
         )
 
+        self.check_traces()
+
         # make sure the 'memory history' command still works even when we're
         # generating a report now
         self.expect(
diff --git a/lldb/test/API/functionalities/asan/TestReportData.py b/lldb/test/API/functionalities/asan/TestReportData.py
index fabc985d0ed44..dd6834a01b80c 100644
--- a/lldb/test/API/functionalities/asan/TestReportData.py
+++ b/lldb/test/API/functionalities/asan/TestReportData.py
@@ -16,14 +16,14 @@ class AsanTestReportDataCase(TestBase):
     @skipUnlessAddressSanitizer
     @skipIf(archs=["i386"], bugnumber="llvm.org/PR36710")
     def test(self):
-        self.build(make_targets=["asan"])
+        self.build(make_targets=["compiler_rt-asan"])
         self.asan_tests()
 
-    @skipIf(oslist=no_match(["macosx"]))
-    @skipIf(bugnumber="rdar://144997976")
+    @skipUnlessDarwin
+    @skipIf(bugnumber="rdar://109913184&143590169")
     def test_libsanitizers_asan(self):
         try:
-            self.build(make_targets=["libsanitizers"])
+            self.build(make_targets=["libsanitizers-asan"])
         except BuildError as e:
             self.skipTest("failed to build with libsanitizers")
         self.asan_tests(libsanitizers=True)
@@ -42,9 +42,7 @@ def asan_tests(self, libsanitizers=False):
         target = self.createTestTarget()
 
         if libsanitizers:
-            self.runCmd(
-                "env SanitizersAddress=1 MallocSanitizerZone=1 MallocSecureAllocator=0"
-            )
+            self.runCmd("env SanitizersAddress=1 MallocSanitizerZone=1")
         else:
             self.registerSanitizerLibrariesWithTarget(target)
 

* Consistent function names
* Extract function for setting and running to
  breakpoint
@@ -10,22 +10,28 @@
from lldbsuite.test import lldbutil
from lldbsuite.test_event.build_exception import BuildError

class AsanTestCase(TestBase):
class MemoryHistoryTestCase(TestBase):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Contributor

@wrotki wrotki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM now

@llvm llvm deleted a comment from github-actions bot Apr 4, 2025
Copy link
Collaborator

@jimingham jimingham left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@yln yln merged commit 4b90f24 into main Apr 7, 2025
10 checks passed
@yln yln deleted the users/yln/libsanitizers-SanitizersAllocationTraces-test branch April 7, 2025 15:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants