如何使用ctrake使用dtrace userland静态探针构建应用程序

时间:2015-02-10 12:21:17

标签: c++ cmake freebsd dtrace

我在freebsd上有一个用c ++编写的服务器应用程序,我想在其中添加dtrace usdt。为了正确构建,USDT探测器需要在包含探测器的所有目标文件上运行dtrace -G命令。比它生成包含一些dtrace函数的目标文件,应用程序应该与它链接。我能够以这种方式运行dtrace,向我的目标添加带有PRE_LINK标志的自定义命令:

add_executable(foo foo.cpp)
target_link_libraries(foo ${foo_libs})
add_custom_command(
  TARGET foo
  PRE_LINK
  COMMAND dtrace -G -s ${DTRACE_PROVIDER} 
    ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/*.o
    -o provider.o
  )

我必须以某种方式将provider.o链接到我的可执行文件,但我不知道如何以干净的方式执行它,如果我将它作为依赖项添加到foo:

add_executable(foo foo.cpp)
target_link_libraries(foo ${foo_libs} provider.o)
在生成provider.o之前,

构建失败。添加另一个假目标不是和选项,因为它看起来像(文档真的很差)dtrace也必须在包含main的目标文件上运行,否则它将无法在应用程序启动时在系统中注册其探测器。有什么想法怎么做?或者也许可以在不修补目标文件的情况下添加sdt探针?

更新

[ 84%] Building CXX object proxy/CMakeFiles/proxy-lib.dir/src/Server.cpp.o
cd /home/pablo/engine/Debug/proxy && /usr/bin/CC -DBOOST_LOG_DYN_LINK -DBOOST_LOG_USE_NATIVE_SYSLOG 
  -DLIBNET_LIL_ENDIAN -std=c++1y -march=native -mtune=native -Wall -pthread -fno-omit-frame-pointer 
  -ggdb3 -O0 -DDEBUG -I/home/pablo/engine/dependencies/asio/include 
  -I/usr/local/include -I/usr/local/include/mysql++ -I/usr/local/include/mysql -I/home/pablo/engine/Debug/UU4/proto 
  -I/home/pablo/engine/common -I/home/pablo/engine -I/home/pablo/engine/proxy/src -I/home/pablo/engine/proxy/test 
  -o CMakeFiles/proxy-lib.dir/src/Server.cpp.o -c /home/pablo/engine/proxy/src/Server.cpp
Linking CXX executable ../server
perform dtrace binary update on files in /home/pablo/engine/Debug/proxy/CMakeFiles/server.dir
cd /home/pablo/engine/Debug/proxy && rm /home/pablo/engine/Debug/proxy/CMakeFiles/server.dir/src/Provider.cpp.o || true
cd /home/pablo/engine/Debug/proxy && dtrace -G -s /home/pablo/engine/proxy/src/Provider.d 
  /home/pablo/engine/Debug/proxy/CMakeFiles/server.dir/*/*.cpp.o -o /home/pablo/engine/Debug/proxy/CMakeFiles/server.dir/src/Provider.cpp.o
cd /home/pablo/engine/Debug/proxy && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/server.dir/link.txt --verbose=1
/usr/bin/CC   -std=c++1y -march=native -mtune=native -Wall -pthread -fno-omit-frame-pointer -ggdb3 
  -O0 -DDEBUG    CMakeFiles/server.dir/src/main.cpp.o CMakeFiles/server.dir/src/ConfigParser.cpp.o CMakeFiles/server.dir/src/Connection.cpp.o 
  CMakeFiles/server.dir/src/ConnectionManager.cpp.o CMakeFiles/server.dir/src/Delegate.cpp.o CMakeFiles/server.dir/src/Request.cpp.o CMakeFiles/server.dir/src/Provider.cpp.o 
  CMakeFiles/server.dir/src/Server.cpp.o  -o ../server  -L/usr/local/lib  ../common/libcommon.a ../proto/libproto.a -lpthread -ltbb /usr/local/lib/libboost_filesystem.so 
  /usr/local/lib/libboost_system.so /usr/local/lib/libboost_unit_test_framework.so /usr/local/lib/libboost_timer.so /usr/local/lib/libboost_program_options.so 
  /usr/local/lib/libboost_regex.so /usr/local/lib/libboost_thread.so /usr/local/lib/mysql/libmysqlclient.so /usr/local/lib/libmysqlpp.so /usr/local/lib/libprotobuf-lite.a 
  /usr/local/lib/libprotobuf.a /usr/local/lib/libsnappy.so /usr/local/lib/libevent.so -lelf -Wl,-rpath,/usr/local/lib:/usr/local/lib/mysql: 

0 个答案:

没有答案