Messages in this thread | | | Subject | Re: Intel PT: Address filtering not working. (cc me) | From | Adrian Hunter <> | Date | Mon, 17 Oct 2016 09:50:11 +0300 |
| |
On 13/10/16 04:11, Muhammad Usman Nadeem wrote: > Usage: sudo perf record -e intel_pt//u --filter='filter 0x400000 / > 0x1000 @./a.out' ./a.out 123 > > a.out is my program (for loop, call using function pointer and use of > longjump) and 123 is the argument. > > Output: [ perf record: Woken up 1 times to write data ] > [ perf record: Captured and wrote 1.171 MB perf.data ] > > > Output contains mostly MTC packets and no TNT or TIP packets. > > I am on the latest mainline version of kernel (b67be92) and perf > version perf version 4.8.gb67be9. > > What could be the problem? > I am using it wrong?
Yes. The perf-record documentation says: "<file name> is the name of the object file, <start> is the offset to the code to trace in that file"
So 0x400000 is well off the end of the file. Try:
--filter='filter 0 / 0x1000 @./a.out'
Also note:
"The kernel may not be able to configure a trace region if it is not within a single mapping. MMAP events (or /proc/<pid>/maps) can be examined to determine if that is a possibility."
You can see mmap events in using perf script with the --show-mmap-events option.
> > Thanks > > > test.c > > > #include <iostream> > #include <setjmp.h> > jmp_buf go; > int foo() > { > return 5; > } > int bar() > { > longjmp(go,1); > return 6; > } > > int main(int argc, char* argv[]) > { > bool jumped = false; > int (*ptr) (); > // if arg then long jump > if (argc != 2) > { > ptr = foo; > } else { > ptr = bar; > } > > for (int i = 0; i < 50000000; ++i) > { > ++i; > --i; > } > setjmp(go); > > if (!jumped) > { > jumped = true; > ptr(); > } else { > std::cout << "AFTER long jump." << std::endl; > } > return 0; > } >
| |