Commit Graph

81 Commits

Author SHA1 Message Date
6e3e1637be libsysprof: add SysprofUserSampler for live unwinding
This instrument triggers the live unwinder in sysprofd to capture a
pre-configured amount of stack contents and CPU registers. You can use
this instead of SysprofSampler in cases where you do not have frame-
pointers but want a useful trace.

It does have a moderate amount of CPU overhead compared to just relying
on frame-pointers so keep that in mind. Generally useful on platforms
that do not have frame pointers such as CentOS.
2024-11-03 10:59:05 -08:00
fde9f5868c libsysprof: add muxer GSource
This allows copying events from a capture stream transparently into the
destination. No processing of the stream is performed, but that may change
in the future to accomidate JIT/Counter translations.

Internal only as support for upcoming live unwinding via external process.
2024-11-03 10:37:20 -08:00
29fc388824 build: always build debuginfod symbolizer
Even if it is disabled, we want the GType enabled and part of our ABI. We
will return NULL if one is created and debuginfod is not supported or if
we failed to create a client.
2024-10-11 11:46:26 -07:00
0d8e004558 libsysprof: fix building with -Ddebuginfod=auto 2024-10-11 11:26:20 -07:00
d2471d4bf5 libsysprof: add debuginfod symbolizer
This is based on a debuginfod_client provided by Barnabás Pőcze in !73.
It extends it to use the new task infrastructure to elevate the download
process to the user while loading a capture file.
2024-10-10 17:12:30 -07:00
50d556b13e sysprof: add SysprofDocumentTask abstraction
This provides a task abstraction to SysprofDocumentLoader so that we can
elevate information about tasks to the user interface. It also moves the
spinner to a menu button w/ popover to display those tasks.
2024-10-10 17:02:06 -07:00
f446178796 allocator: add 16kb page bump allocator
This is a private allocator that can be used for large groups of
allocations that are tied to a specific object.

For example, the callgraph owning many nodes can use this so all the nodes
are allocated together, but also freed in a single stage ignoring all the
complex GList linked nodes among them.
2024-09-12 10:52:18 -07:00
d7eff5864b build: ensure symbols are exported for libsysprof-6
This fixes an issue where the symbols are not getting T as they are dropped
when pulling in the static archive.

This compiles twice, but that is fine for now until we come up with something
better in the long run.
2024-03-07 14:06:05 -08:00
82020e86be libsysprof: add instrument to record scheduler switching
This is to allow us to look at what processes were running when as a way
to get a high-level overview of usage.
2023-08-21 15:05:48 -07:00
bf73d142dc libsysprof: sort frames with timsort
These are largely pre-sorted, but not fully when you have merged data. This
uses timsort to speed that up a bit.

In particular, the comparison of various sorts break down to (for a
~32,000,000 record capture.

  g_array_sort_with_data() => 3.9 seconds
  qsort_r() = > 3.7 seconds
  gtk_tim_sort() => .79 seconds
2023-08-18 16:46:28 -07:00
f7a32750e2 libsysprof: add leak detector helper
This is a leak detector by finding allocations which do not have a
corresponding free record.
2023-08-14 16:02:46 -07:00
fba4642451 build: fix static dep race in enums 2023-08-07 15:41:43 -07:00
c38c1fb4b0 libsysprof: allow specifying phase for subprocess output
This is helpful in that you can specify which phase of the capture the
process should be run so that it's less likely to show up on profiles.
2023-08-07 12:54:46 -07:00
433dff95ce libsysprof: add helper instrument for subprocess output 2023-08-06 14:51:42 -07:00
2c0f055af1 build: make sysprof-journald-source.c conditional
Fixes #88
2023-08-02 11:57:32 -07:00
2529abc3db build: add missing header 2023-07-30 13:42:10 -07:00
f93767cfb2 meson: use variables for gio-2.0, glib-2.0, and gio-unix-2.0 2023-07-28 14:00:04 -05:00
79ba6ab3d5 meson: remove explicit pkgconfig install_dir
This is the default.
2023-07-28 13:09:48 -05:00
048e366ea9 libsysprof: add a SysprofTracefdConsumer
This is meant to simplify the proxying of data from a tracefd into the
destination capture.
2023-07-27 15:40:59 -07:00
8dd2d3d73c libsysprof: add support for dbus messages as a document type 2023-07-27 12:22:31 -07:00
b8f39ef20a build: fix library name for libsysprof-6.so 2023-07-20 16:11:14 -07:00
4a8d5007e5 libsysprof: add scaffolding to perform category summaries
The goal here is to summarize the categories starting from a specific
frame.
2023-07-20 16:04:42 -07:00
c8e09327fc libsysprof: add simple text format for category rules 2023-07-20 14:30:34 -07:00
cab3f086f7 build: ensure enums header is build 2023-07-20 13:19:21 -07:00
ae7201c9ff libsysprof: use callgraph node to categorize for icons 2023-07-20 12:20:25 -07:00
5afb315be5 libsysprof: fix flags get type generation 2023-07-20 11:24:04 -07:00
dbb7833cbf libsysprof: join libsysprof-analyze and libsysprof-profile
This brings together the two libraries back into one now that the whole
design is pretty well sorted out. They depend on roughly the same libraries
anyway and it's way easier of the single library can both read and write
the capture files (along with bringing in libsysprof-capture symbols in
a single place).
2023-07-19 17:40:41 -07:00
12e75e4c8c build: remove libsysprof
This library is going away now that we have -analyze and -profile libs.
2023-07-17 11:38:25 -07:00
8202a40f4d preload: hoist preloads into src/ directory
They will get used from libsysprof-profile, but it's nice to have them
a directory up going forward.
2023-06-06 16:32:21 -07:00
38dbf0dc95 build: add mapped_ring_buffer_sources for inclusion
We use this in various places but it relies on some static API in the
libsysprof-capture. Make it available to the other libraries.
2023-05-26 16:46:44 -07:00
efab045006 libsysprof-analyze: start on sysprof-analyze library
The goal here is to break up libsysprof into a library for recording
profiles (using libsysprof-capture) and a library for analyzing profiles
(both used by the sysprof UI).
2023-04-25 11:57:26 -07:00
dcbeb0f87a libsysprof: add SysprofCaptureModel
This adds a GListModel that we can use to load capture files. The goal here
is to map the entire capture into memory so we can avoid reading lots of
buffers. That also allows for the model items to live as long as the model
is alive (or underlying file map, really).

The next goal is to stack features on top of this such as implementing the
callgraph as a filter of the model, or generic filters between the
callgraph model and the actual data source model.
2023-04-24 17:26:45 -07:00
6d50f3ca7b meson: Override dependencies to improve usage as a subproject
With this change, sysprof can be consumed as a subproject without
making any changes to the build files of a project. All you need to do
is provide a wrap file with a `[provide]` section:

https://mesonbuild.com/Wrap-dependency-system-manual.html#provide-section

This is also necessary because otherwise projects need to hard-code
the subproject name, which might be `sysprof` when using `wrap-git` or
`sysprof-3.46.0` when using `wrap-file` (to build from a release
tarball). This can cause conflicts between different subprojects that
consume sysprof differently.

Other projects like glib, cairo, pango, etc already do this.
2022-12-18 10:04:00 +05:30
c3035efd52 tools: add -Dagent=true option
This also builds the agent statically with libsysprof_static_dep since
we'd need that to avoid installing libsysprof when that isn't wanted.
It also ensures the LD_PRELOAD libraries are installed for use by the
agent.
2022-07-21 18:35:35 -07:00
757d36ae8e Cleanup the build a bit
Makes the Meson build a little bit better and cleans up some of the
formatting.
2022-05-25 14:07:02 -05:00
e02785ba23 start on new resolver for paths 2021-09-14 19:53:46 -07:00
b22899474d proc: discover filesystem root for podman containers
For processes we find in a podman container, we can sniff the libpod
cgroup scope. Using that we can translate into the podman layer that
contains the files.

With that, future work could find the proper .so when resolving based on
alternate roots for the process.
2021-02-24 18:40:41 -08:00
f0303f4b68 meson: Fix pkgconfig generation
This fix error when gio is a subproject, when there is pc file
assotiated for objects in libraries_private meson automatically promote
them to requires.

Also remove some values that are already the default.
2020-10-01 10:15:38 -04:00
04b6fdfcbe libsysprof, libsysprof-ui: Generate pkg-config dependencies
Otherwise, using libsysprof-ui will usually fail because <dazzle.h>
is not added to the search path.

Resolves: https://gitlab.gnome.org/GNOME/sysprof/-/issues/49
Signed-off-by: Simon McVittie <smcv@debian.org>
2020-09-16 10:48:04 +01:00
68c50ba869 build: Pass libraries to pkgconfig.generate as a positional argument
This allows Meson to associate the pkg-config module with the "main"
library that it represents, in an unambiguous way.

Signed-off-by: Simon McVittie <smcv@debian.org>
2020-09-16 10:47:22 +01:00
3c7b76c6ba build: Move Meson dependency() calls to where they’re used
This avoids making the project depend on all its dependencies, some of
which are optional, when being built as a Meson subproject.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
2020-07-03 22:01:33 +01:00
b449baa205 libsysprof-capture: Move MappedRingBufferSource to libsysprof
As preparation for dropping the GLib dependency from libsysprof-capture,
move the `GSource` which links a `MappedRingBuffer` to a `GMainContext`
from libsysprof-capture to libsysprof.

This requires adding one new piece of API to libsysprof-capture to check
whether the `MappedRingBuffer` is empty.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

Helps: #40
2020-07-02 21:07:11 +01:00
d2047fb557 libsysprof-capture: Move autocleanup definitions to libsysprof
In preparation for dropping the GLib dependency from libsysprof-capture,
move the autocleanup definitions up to libsysprof. Add a new header for
them.

This is slightly awkward in the tools, which depend on
libsysprof-capture but not libsysprof. Rather than make them depend on
libsysprof (which might be disabled at configure time), include the
`sysprof-capture-autocleanups.h` file between source directories.
`SYSPROF_COMPILATION` needs to be defined for this to work.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

Helps: #40
2020-07-02 21:07:11 +01:00
a70907be0e libsysprof: add simple preload source
This source is useful to quickly add an LD_PRELOAD to a profiler.
2020-03-13 15:50:46 -07:00
089f5d7c56 control-fd: add SysprofControlSource
This is a source that will allow the inferior to call into Sysprof to
create a new mmap()'d ring buffer to share data. This allows significantly
less overhead in the child process as Sysprof itself will take care of
copying the data out of the inferior into the final capture file. There is
more copying of course, but less intrusive to the inferior itself.
2020-02-13 18:53:58 -08:00
33c81a3a9c memprof: add memory profiling using LD_PRELOAD
This brings over some of the techniques from the old memprof design.
Sysprof and memprof shared a lot of code, so it is pretty natural to
bring back the same callgraph view based on memory allocations.

This reuses the StackStash just like it did in memprof. While it
would be nice to reuse some existing tools out there, the fit of
memprof with sysprof is so naturally aligned, it's not really a
big deal to bring back the LD_PRELOAD. The value really comes
from seeing all this stuff together instead of multiple apps.

There are plenty of things we can implement on top of this that
we are not doing yet such as temporary allocations, cross-thread
frees, graphing the heap, and graphing differences between the
heap at to points in time. I'd like all of these things, given
enough time to make them useful.

This is still a bit slow though due to the global lock we take
to access the writer. To improve the speed here we need to get
rid of that lock and head towards a design that allows a thread
to request a new writer from Sysprof and save it in TLS (to be
destroyed when the thread exits).
2020-02-07 19:00:33 -08:00
9a3a95a5ca podman: add debug directories from podman containers
This is meant to allow us to find the debug files for a given library for
podman containers running as the current user. However, we still need to
try to translate the fuse-overlayfs paths when parsing the /proc/pid/mounts
or we'll have incorrect paths coming from the event stream.
2020-01-24 10:54:32 -08:00
653ff6ba9e build: add datadir to pkgconfig files
Mutter wants sysprof's exact dbus interface directory during build time
* https://gitlab.gnome.org/GNOME/mutter/blob/master/src/meson.build#L714

On certain platforms mutter's datadir != sysprof's datadir.
This is initial work for a forthcoming PR to do
```
sysprof_dep.get_pkgconfig_variable('datadir')
```
in mutter for compatibility with these platforms.

This patch is on behalf of nixpkgs where we actually have to carry a 
downstream patch [0] for this exact reason. We install everything into 
their own immutable prefix under `/nix/store`.

[0]: a821167046/pkgs/desktops/gnome-3/core/mutter/0001-build-use-get_pkgconfig_variable-for-sysprof-dbusdir.patch
2019-12-04 17:17:58 -05:00
1c90e3da80 libsysprof: remove symbol-dirs
This is automatically done for the cases we care about, so this can be
removed now (in favor of tuning the elf symbol resolver manually).
2019-08-03 01:03:59 -07:00
aad61d52f3 flatpak: add helpers to locate flatpak installation debug dirs
The goal here is to be able to locate all of the debug directories for
active flatpak runtimes so that we can possibly decode debug libraries
from them (after verifying build-id/CRC).
2019-08-02 18:15:02 -07:00