diff --git a/systrace/CMakeLists.txt b/systrace/CMakeLists.txt index 05d67f2469df69f8c62296c0b9bbcaed0f15d648..09c11a6ad2e8daa913986a9564edbf73af89d874 100644 --- a/systrace/CMakeLists.txt +++ b/systrace/CMakeLists.txt @@ -44,7 +44,12 @@ target_include_directories(common PUBLIC ${PROJECT_SOURCE_DIR}/include ${Python3 add_subdirectory(protos) -add_subdirectory(src/os) +if(HAS_BTF_SUPPORT) + message(STATUS "Enabling BPF modules with BTF support") + add_subdirectory(src/os) +else() + message(WARNING "Disabling BPF modules (no BTF support)") +endif() add_library(sysTrace_hook SHARED ${PROJECT_SOURCE_DIR}/include/common/shared_constants.c @@ -66,6 +71,11 @@ add_executable(sysTrace_cli ) set_target_properties(sysTrace_hook PROPERTIES OUTPUT_NAME "sysTrace") +if(HAS_BTF_SUPPORT) + target_compile_definitions(sysTrace_hook PRIVATE HAS_BTF_SUPPORT=1) +endif() + + target_link_libraries(sysTrace_hook common general_pb2 @@ -73,6 +83,9 @@ target_link_libraries(sysTrace_hook protobuf::libprotobuf ${CMAKE_THREAD_LIBS} pthread - os_probe -ldl ) +if(HAS_BTF_SUPPORT) + target_link_libraries(sysTrace_hook os_probe) + message(STATUS "Linking osprobe library") +endif() \ No newline at end of file diff --git a/systrace/build.sh b/systrace/build.sh index 32cecad0510ead6dc4e8088d6f08f50310f00a86..0de3a6a2f8c9415570e48d019ed9cfacd0f30265 100644 --- a/systrace/build.sh +++ b/systrace/build.sh @@ -1,30 +1,57 @@ #!/bin/bash -sudo dnf remove -y libunwind libunwind-devel 2>/dev/null || true -mkdir -p build -mkdir -p /etc/systrace/config -rm /sys/fs/bpf/sysTrace -rf -mount -t bpf bpf /sys/fs/bpf/ -rm src/os/*.o -rf -rm src/os/*.skel.h -rf - -cp -f config/PyFuncList /etc/systrace/config/PyFuncList - -PROTOC_VERSION=$(protoc --version | awk '{print $2}' | cut -d. -f1) -PROTO_FILE="" -PROTO_EXTRA_OPT="" - -cd protos -if [ "$PROTOC_VERSION" -ge 3 ]; then - mv systrace.v3.proto systrace.proto -else - mv systrace.v2.proto systrace.proto -fi -protoc --c_out=. systrace.proto -protoc --cpp_out=. systrace.proto -protoc --python_out=. systrace.proto -cd .. - -cd build -cmake .. -make -j $(nproc) \ No newline at end of file +CONFIG_DIR="/etc/systrace/config" +PY_FUNC_LIST="config/PyFuncList" +BPF_MOUNT="/sys/fs/bpf" +PROTOS_DIR="protos" +BUILD_DIR="build" + +cleanup() { + mkdir -p "$BUILD_DIR" "$CONFIG_DIR" + sudo rm -rf "$BPF_MOUNT/sysTrace" + sudo mount -t bpf bpf "$BPF_MOUNT/" 2>/dev/null || true + rm -f src/os/*.{o,skel.h} +} + +setup_config() { + [ -f "$PY_FUNC_LIST" ] && sudo cp -f "$PY_FUNC_LIST" "$CONFIG_DIR/" +} + +compile_proto() { + cd "$PROTOS_DIR" + PROTOC_VERSION=$(protoc --version | awk '{print $2}' | cut -d. -f1) + PROTO_FILE="" + PROTO_EXTRA_OPT="" + + if [ "$PROTOC_VERSION" -ge 3 ]; then + mv systrace.v3.proto systrace.proto + else + mv systrace.v2.proto systrace.proto + fi + protoc --{c,cpp,python}_out=. systrace.proto + cd .. +} + +check_btf() { + [ -f "/sys/kernel/btf/vmlinux" ] && return 0 + grep -q "CONFIG_DEBUG_INFO_BTF=y" "/boot/config-$(uname -r)" 2>/dev/null && return 0 + return 1 +} + +build() { + cd "$BUILD_DIR" + cmake_flags="" + check_btf && cmake_flags="-DHAS_BTF_SUPPORT=ON" || cmake_flags="-DHAS_BTF_SUPPORT=OFF" + cmake .. $cmake_flags + make -j $(nproc) + cd .. +} + +main() { + cleanup + setup_config + compile_proto + build +} + +main "$@" \ No newline at end of file diff --git a/systrace/src/trace/systrace_manager.cc b/systrace/src/trace/systrace_manager.cc index 0996ee92a3db145d5d7858d764b6f21dbeec2969..c678545e494ebf3bb0aaa1b484013241ad814959 100644 --- a/systrace/src/trace/systrace_manager.cc +++ b/systrace/src/trace/systrace_manager.cc @@ -11,10 +11,12 @@ int global_stage_id = 0; int global_stage_type = 0; +#ifdef HAS_BTF_SUPPORT extern "C" { int run_osprobe(); void cleanup_osprobe(); } +#endif namespace systrace { @@ -206,7 +208,9 @@ SysTrace &SysTrace::getInstance() SysTrace::~SysTrace() { +#ifdef HAS_BTF_SUPPORT stopOsProbePoller(); +#endif stopEventPoller(); } @@ -219,7 +223,9 @@ void SysTrace::initializeSystem() MonitorServer::getInstance(); MSPTITracker::getInstance(); PyTorchTrace::getInstance(); +#ifdef HAS_BTF_SUPPORT os_probe_ = std::thread(&run_osprobe); +#endif startEventPoller(); } @@ -234,6 +240,7 @@ void SysTrace::startEventPoller() STLOG(INFO) << "[SysTrace] Event poller started"; } +#ifdef HAS_BTF_SUPPORT void SysTrace::stopOsProbePoller() { cleanup_osprobe(); @@ -251,6 +258,7 @@ void SysTrace::stopEventPoller() event_poller_.join(); } } +#endif void SysTrace::eventPollerMain() { diff --git a/systrace/src/trace/systrace_manager.h b/systrace/src/trace/systrace_manager.h index f81fef650ee0762ec0d279734eabca742aef70a2..03c5c4233542ef18036edc02d5355ece384077e9 100644 --- a/systrace/src/trace/systrace_manager.h +++ b/systrace/src/trace/systrace_manager.h @@ -66,7 +66,6 @@ class SysTrace void initializeSystem(); void startEventPoller(); void stopEventPoller(); - void stopOsProbePoller(); void eventPollerMain(); inline static SysTrace *instance_ = nullptr; @@ -75,7 +74,11 @@ class SysTrace std::atomic should_run_{true}; std::atomic loop_count_{0}; std::thread event_poller_; + +#ifdef HAS_BTF_SUPPORT + void stopOsProbePoller(); std::thread os_probe_; +#endif }; } // namespace systrace \ No newline at end of file