Giter Site home page Giter Site logo

charpercyr / dyntrace Goto Github PK

View Code? Open in Web Editor NEW
12.0 3.0 2.0 1.29 MB

Dynamic tracing in Linux using fast tracepoints

License: GNU Lesser General Public License v3.0

CMake 4.68% C++ 85.70% Assembly 3.41% Python 6.14% C 0.07%
tracepoints tracing fast-tracepoints x86 arm

dyntrace's Introduction

dyntrace

This project implements a fast tracepoint insertion ecosystem for x86(_64) on Linux.

Getting Started

Prerequesites

To build the library, you must install the following.

Libraries

Programs

Building & Installing

mkdir build
cd build
cmake ..
make
sudo make install

After this, you must create the dyntrace group.

sudo groupadd dyntrace
sudo usermod -aG dyntrace <your username>

Simple usage

First, start the dyntraced daemon.

sudo dyntraced --daemonize

Then attach to any program. If your user is not in the dyntrace group, you won't be allowed to do this command.

dyntrace attach <pid or name>

Then add a tracepoint. It will log to the file /tmp/test.log.

dyntrace add <pid or name>:<function name or address> log /tmp/test.log

There will be an output on the command line, this is the name of the tracepoint with the form tp-#

Wait a bit, then remove the tracepoint.

dyntrace rm <pid or name>:tp-#

Full example:

sudo dyntraced --daemonize
dyntrace attach nano
dyntrace add nano:do_home lttng
...
dyntrace rm nano:tp-0
sudo pkill dyntraced

More details in the docs folder.

To trace x86 programs, you need the x86 build on x64.

TODO

  • ARM 64bit

Contact

Christian Harper-Cyr [email protected]

dyntrace's People

Contributors

charpercyr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

dyntrace's Issues

absolute executable loading support

Executables which load at absolute addresses are not supported. If someone tries to place a tracepoint, the library will resolve the address as if PIC is used.

Not building on Fedora

While building dyntrace:

[ 71%] Building CXX object src/dyntrace/agent/CMakeFiles/agent.dir/main.cpp.o
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:270:18: error: « io_context » dans l'espace de noms « boost::asio » ne nomme pas un type
     boost::asio::io_context _ctx;
                  ^~~~~~~~~~
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp: Dans le constructeur « agent_main::agent_main() »:
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:55:17: error: « _ctx » n'a pas été déclaré dans cette portée
         : _sock{_ctx}
                 ^~~~
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:55:21: error: pas de fonction concordante pour l'appel à « boost::asio::basic_stream_socket<boost::asio::local::stream_protocol>::basic_stream_socket(<brace-enclosed initializer list>) »
         : _sock{_ctx}
                     ^
In file included from /usr/include/boost/asio.hpp:31:0,
                 from /home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:11:
/usr/include/boost/asio/basic_stream_socket.hpp:183:3: note: candidate: template<class Protocol1, class StreamSocketService1> boost::asio::basic_stream_socket<Protocol, StreamSocketService>::basic_stream_socket(boost::asio::basic_stream_socket<Protocol1, StreamSocketService1>&&, typename std::enable_if<std::is_convertible<_Rep2, _Rep>::value>::type*)
   basic_stream_socket(
   ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/basic_stream_socket.hpp:183:3: note:   la déduction/substitution de l'argument du patron a échoué:
/usr/include/boost/asio/basic_stream_socket.hpp:148:3: note: candidate: boost::asio::basic_stream_socket<Protocol, StreamSocketService>::basic_stream_socket(boost::asio::basic_stream_socket<Protocol, StreamSocketService>&&) [with Protocol = boost::asio::local::stream_protocol; StreamSocketService = boost::asio::stream_socket_service<boost::asio::local::stream_protocol>]
   basic_stream_socket(basic_stream_socket&& other)
   ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/basic_stream_socket.hpp:148:3: note:   la conversion de l'argument 1 serait mal formée:
/usr/include/boost/asio/basic_stream_socket.hpp:130:3: note: candidate: boost::asio::basic_stream_socket<Protocol, StreamSocketService>::basic_stream_socket(boost::asio::io_service&, const protocol_type&, const native_handle_type&) [with Protocol = boost::asio::local::stream_protocol; StreamSocketService = boost::asio::stream_socket_service<boost::asio::local::stream_protocol>; boost::asio::basic_stream_socket<Protocol, StreamSocketService>::protocol_type = boost::asio::local::stream_protocol; boost::asio::basic_stream_socket<Protocol, StreamSocketService>::native_handle_type = int]
   basic_stream_socket(boost::asio::io_service& io_service,
   ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/basic_stream_socket.hpp:130:3: note:   le candidat attend 3 arguments, 1 fourni(s)
/usr/include/boost/asio/basic_stream_socket.hpp:110:3: note: candidate: boost::asio::basic_stream_socket<Protocol, StreamSocketService>::basic_stream_socket(boost::asio::io_service&, const endpoint_type&) [with Protocol = boost::asio::local::stream_protocol; StreamSocketService = boost::asio::stream_socket_service<boost::asio::local::stream_protocol>; boost::asio::basic_stream_socket<Protocol, StreamSocketService>::endpoint_type = boost::asio::local::basic_endpoint<boost::asio::local::stream_protocol>]
   basic_stream_socket(boost::asio::io_service& io_service,
   ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/basic_stream_socket.hpp:110:3: note:   le candidat attend 2 arguments, 1 fourni(s)
/usr/include/boost/asio/basic_stream_socket.hpp:89:3: note: candidate: boost::asio::basic_stream_socket<Protocol, StreamSocketService>::basic_stream_socket(boost::asio::io_service&, const protocol_type&) [with Protocol = boost::asio::local::stream_protocol; StreamSocketService = boost::asio::stream_socket_service<boost::asio::local::stream_protocol>; boost::asio::basic_stream_socket<Protocol, StreamSocketService>::protocol_type = boost::asio::local::stream_protocol]
   basic_stream_socket(boost::asio::io_service& io_service,
   ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/basic_stream_socket.hpp:89:3: note:   le candidat attend 2 arguments, 1 fourni(s)
/usr/include/boost/asio/basic_stream_socket.hpp:72:12: note: candidate: boost::asio::basic_stream_socket<Protocol, StreamSocketService>::basic_stream_socket(boost::asio::io_service&) [with Protocol = boost::asio::local::stream_protocol; StreamSocketService = boost::asio::stream_socket_service<boost::asio::local::stream_protocol>]
   explicit basic_stream_socket(boost::asio::io_service& io_service)
            ^~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/basic_stream_socket.hpp:72:12: note:   la conversion de l'argument 1 serait mal formée:
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp: Dans la fonction membre « void agent_main::run() »:
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:95:41: error: pas de fonction concordante pour l'appel à « agent_main::do_read(boost::asio::const_buffers_1) »
                     do_read(buffer(data));
                                         ^
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:126:10: note: candidate: void agent_main::do_read(boost::asio::mutable_buffer)
     void do_read(boost::asio::mutable_buffer buf)
          ^~~~~~~
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:126:10: note:   pas de conversion connue pour convertir l'argument 1 depuis « boost::asio::const_buffers_1 » vers « boost::asio::mutable_buffer »
In file included from /usr/include/boost/asio/impl/write.hpp:23:0,
                 from /usr/include/boost/asio/write.hpp:618,
                 from /usr/include/boost/asio/buffered_write_stream.hpp:29,
                 from /usr/include/boost/asio/buffered_stream.hpp:22,
                 from /usr/include/boost/asio.hpp:38,
                 from /home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:11:
/usr/include/boost/asio/detail/consuming_buffers.hpp: Dans l'instanciation de « class boost::asio::detail::consuming_buffers<boost::asio::mutable_buffer, boost::asio::mutable_buffer> » :
/usr/include/boost/asio/impl/read.hpp:45:44:   requis par « std::size_t boost::asio::read(SyncReadStream&, const MutableBufferSequence&, CompletionCondition, boost::system::error_code&) [with SyncReadStream = boost::asio::basic_stream_socket<boost::asio::local::stream_protocol>; MutableBufferSequence = boost::asio::mutable_buffer; CompletionCondition = boost::asio::detail::transfer_all_t; std::size_t = long unsigned int] »
/usr/include/boost/asio/impl/read.hpp:64:39:   requis par « std::size_t boost::asio::read(SyncReadStream&, const MutableBufferSequence&) [with SyncReadStream = boost::asio::basic_stream_socket<boost::asio::local::stream_protocol>; MutableBufferSequence = boost::asio::mutable_buffer; std::size_t = long unsigned int] »
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:132:32:   requis depuis ici
/usr/include/boost/asio/detail/consuming_buffers.hpp:164:5: error: pas de type nommé « const_iterator » dans « class boost::asio::mutable_buffer »
     const_iterator;
     ^~~~~~~~~~~~~~
/usr/include/boost/asio/detail/consuming_buffers.hpp:261:36: error: pas de type nommé « const_iterator » dans « class boost::asio::mutable_buffer »
   typename Buffers::const_iterator begin_remainder_;
                                    ^~~~~~~~~~~~~~~~
In file included from /usr/include/boost/asio/read.hpp:631:0,
                 from /usr/include/boost/asio.hpp:89,
                 from /home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:11:
/usr/include/boost/asio/impl/read.hpp: Dans l'instanciation de « std::size_t boost::asio::read(SyncReadStream&, const MutableBufferSequence&, CompletionCondition, boost::system::error_code&) [with SyncReadStream = boost::asio::basic_stream_socket<boost::asio::local::stream_protocol>; MutableBufferSequence = boost::asio::mutable_buffer; CompletionCondition = boost::asio::detail::transfer_all_t; std::size_t = long unsigned int] » :
/usr/include/boost/asio/impl/read.hpp:64:39:   requis par « std::size_t boost::asio::read(SyncReadStream&, const MutableBufferSequence&) [with SyncReadStream = boost::asio::basic_stream_socket<boost::asio::local::stream_protocol>; MutableBufferSequence = boost::asio::mutable_buffer; std::size_t = long unsigned int] »
/home/loicgelle/Data_Drive/dyntrace/src/dyntrace/agent/main.cpp:132:32:   requis depuis ici
/usr/include/boost/asio/impl/read.hpp:49:14: error: « class boost::asio::detail::consuming_buffers<boost::asio::mutable_buffer, boost::asio::mutable_buffer> » n'a pas de membre nommé « begin »
   while (tmp.begin() != tmp.end())
          ~~~~^~~~~
/usr/include/boost/asio/impl/read.hpp:49:29: error: « class boost::asio::detail::consuming_buffers<boost::asio::mutable_buffer, boost::asio::mutable_buffer> » n'a pas de membre nommé « end »
   while (tmp.begin() != tmp.end())
                         ~~~~^~~
make[2]: *** [src/dyntrace/agent/CMakeFiles/agent.dir/build.make:63: src/dyntrace/agent/CMakeFiles/agent.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:443: src/dyntrace/agent/CMakeFiles/agent.dir/all] Error 2
make: *** [Makefile:152: all] Error 2

Maybe a version mismatch of boost? I installed boost-develusing dnf.

Fix README

Tiny bug, you should replace the following:

mkdir build

by

mkdir build && cd build

in your README.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.