Files
clang-p2996/lldb/test/API/commands/trace/TestTraceEvents.py
Walter Erquinigo 059f39d2f4 [trace][intel pt] Support events
A trace might contain events traced during the target's execution. For
example, a thread might be paused for some period of time due to context
switches or breakpoints, which actually force a context switch. Not only
that, a trace might be paused because the CPU decides to trace only a
specific part of the target, like the address filtering provided by
intel pt, which will cause pause events. Besides this case, other kinds
of events might exist.

This patch adds the method `TraceCursor::GetEvents()`` that returns the
list of events that happened right before the instruction being pointed
at by the cursor. Some refactors were done to make this change simpler.

Besides this new API, the instruction dumper now supports the -e flag
which shows pause events, like in the following example, where pauses
happened due to breakpoints.

```
thread #1: tid = 2717361
  a.out`main + 20 at main.cpp:27:20
    0: 0x00000000004023d9    leaq   -0x1200(%rbp), %rax
  [paused]
    1: 0x00000000004023e0    movq   %rax, %rdi
  [paused]
    2: 0x00000000004023e3    callq  0x403a62                  ; std::vector<int, std::allocator<int> >::vector at stl_vector.h:391:7
  a.out`std::vector<int, std::allocator<int> >::vector() at stl_vector.h:391:7
    3: 0x0000000000403a62    pushq  %rbp
    4: 0x0000000000403a63    movq   %rsp, %rbp
```

The `dump info` command has also been updated and now it shows the
number of instructions that have associated events.

Differential Revision: https://reviews.llvm.org/D123982
2022-04-25 19:01:23 -07:00

83 lines
2.8 KiB
Python

import lldb
from intelpt_testcase import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
from lldbsuite.test.decorators import *
class TestTraceEvents(TraceIntelPTTestCaseBase):
mydir = TestBase.compute_mydir(__file__)
@testSBAPIAndCommands
def testPauseEvents(self):
'''
Everytime the target stops running on the CPU, a 'disabled' event will
be emitted, which is represented by the TraceCursor API as a 'paused'
event.
'''
self.expect("target create " +
os.path.join(self.getSourceDir(), "intelpt-trace-multi-file", "a.out"))
self.expect("b 12")
self.expect("r")
self.traceStartThread()
self.expect("n")
self.expect("n")
self.expect("si")
self.expect("si")
self.expect("si")
# We ensure that the paused events are printed correctly forward
self.expect("thread trace dump instructions -e -f",
patterns=[f'''thread #1: tid = .*
a.out`main \+ 23 at main.cpp:12
0: {ADDRESS_REGEX} movl .*
\[paused\]
1: {ADDRESS_REGEX} addl .*
2: {ADDRESS_REGEX} movl .*
\[paused\]
a.out`main \+ 34 \[inlined\] inline_function\(\) at main.cpp:4
3: {ADDRESS_REGEX} movl .*
a.out`main \+ 41 \[inlined\] inline_function\(\) \+ 7 at main.cpp:5
4: {ADDRESS_REGEX} movl .*
5: {ADDRESS_REGEX} addl .*
6: {ADDRESS_REGEX} movl .*
a.out`main \+ 52 \[inlined\] inline_function\(\) \+ 18 at main.cpp:6
7: {ADDRESS_REGEX} movl .*
a.out`main \+ 55 at main.cpp:14
8: {ADDRESS_REGEX} movl .*
9: {ADDRESS_REGEX} addl .*
10: {ADDRESS_REGEX} movl .*
\[paused\]
a.out`main \+ 63 at main.cpp:16
11: {ADDRESS_REGEX} callq .* ; symbol stub for: foo\(\)
\[paused\]
a.out`symbol stub for: foo\(\)
12: {ADDRESS_REGEX} jmpq'''])
# We ensure that the paused events are printed correctly backward
self.expect("thread trace dump instructions -e --id 12",
patterns=[f'''thread #1: tid = .*
a.out`symbol stub for: foo\(\)
12: {ADDRESS_REGEX} jmpq .*
\[paused\]
a.out`main \+ 63 at main.cpp:16
11: {ADDRESS_REGEX} callq .* ; symbol stub for: foo\(\)
\[paused\]
a.out`main \+ 60 at main.cpp:14
10: {ADDRESS_REGEX} movl .*
9: {ADDRESS_REGEX} addl .*
8: {ADDRESS_REGEX} movl .*
a.out`main \+ 52 \[inlined\] inline_function\(\) \+ 18 at main.cpp:6
7: {ADDRESS_REGEX} movl .*
a.out`main \+ 49 \[inlined\] inline_function\(\) \+ 15 at main.cpp:5
6: {ADDRESS_REGEX} movl .*
5: {ADDRESS_REGEX} addl .*
4: {ADDRESS_REGEX} movl .*
a.out`main \+ 34 \[inlined\] inline_function\(\) at main.cpp:4
3: {ADDRESS_REGEX} movl .*
\[paused\]
a.out`main \+ 31 at main.cpp:12
2: {ADDRESS_REGEX} movl .*
1: {ADDRESS_REGEX} addl .*
\[paused\]
0: {ADDRESS_REGEX} movl .*'''])