google / perfetto

Performance instrumentation and tracing for Android, Linux and Chrome (read-only mirror of https://android.googlesource.com/platform/external/perfetto/)
https://www.perfetto.dev
Apache License 2.0
2.75k stars 344 forks source link

`enable_perfetto_ipc=true` support on windows in sdk/perfetto.cc #348

Closed blockspacer closed 2 years ago

blockspacer commented 2 years ago

I'm trying build sdk/perfetto.cc and link with it as in https://perfetto.dev/docs/instrumentation/tracing-sdk

cmd.exe /C "cd . && C:\Users\den00\.conan\data\cmake\3.23.1\_\_\package\01edd76db8e16db9b38c3cca44ec466a9444c388\bin\cmake.exe -E vs_link_exe --intdir=CMakeFiles\perfetto_test_package.dir --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100190~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100190~1.0\x64\mt.exe --manifests  -- C:\PROGRA~1\LLVM\bin\lld-link.exe /nologo CMakeFiles\perfetto_test_package.dir\test_package.cpp.obj CMakeFiles\perfetto_test_package.dir\chrome_track_event.pbzero.cc.obj  /out:perfetto_test_package.exe /implib:perfetto_test_package.lib /pdb:perfetto_test_package.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console  perfetto_sdk.lib  C:\.conan\2d5c3f\1\lib\perfetto_trace_protos.lib  kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK Pass 1: command "C:\PROGRA~1\LLVM\bin\lld-link.exe /nologo CMakeFiles\perfetto_test_package.dir\test_package.cpp.obj CMakeFiles\perfetto_test_package.dir\chrome_track_event.pbzero.cc.obj /out:perfetto_test_package.exe /implib:perfetto_test_package.lib /pdb:perfetto_test_package.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console perfetto_sdk.lib C:\.conan\2d5c3f\1\lib\perfetto_trace_protos.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\perfetto_test_package.dir/intermediate.manifest CMakeFiles\perfetto_test_package.dir/manifest.res" failed (exit code 1) with the following output:
lld-link: error: undefined symbol: __declspec(dllimport) closesocket
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69018
>>>               perfetto_sdk.lib(perfetto.cc.obj):(int __cdecl perfetto::base::CloseSocket(unsigned __int64))

lld-link: error: undefined symbol: __declspec(dllimport) socket
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69010
>>>               perfetto_sdk.lib(perfetto.cc.obj):(class base::0xE6D3EB86::ScopedResource<unsigned __int64, &int __cdecl perfetto::base::CloseSocket(unsigned __int64), -1, 1, struct perfetto::base::internal::DefaultValidityChecker<unsigned __int64, -1>> __cdecl perfetto::base::`anonymous namespace'::CreateSocketHandle(enum base::0xE6D3EB86::SockFamily, enum base::0xE6D3EB86::SockType))

lld-link: error: undefined symbol: __declspec(dllimport) setsockopt
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69089
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: __cdecl perfetto::base::UnixSocketRaw::UnixSocketRaw(class perfetto::base::ScopedResource<unsigned __int64, &int __cdecl perfetto::base::CloseSocket(unsigned __int64), -1, 1, struct perfetto::base::internal::DefaultValidityChecker<unsigned __int64, -1>>, enum perfetto::base::SockFamily, enum perfetto::base::SockType))
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69095
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: __cdecl perfetto::base::UnixSocketRaw::UnixSocketRaw(class perfetto::base::ScopedResource<unsigned __int64, &int __cdecl perfetto::base::CloseSocket(unsigned __int64), -1, 1, struct perfetto::base::internal::DefaultValidityChecker<unsigned __int64, -1>>, enum perfetto::base::SockFamily, enum perfetto::base::SockType))
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69408
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: bool __cdecl perfetto::base::UnixSocketRaw::SetTxTimeout(unsigned int))
>>> referenced 1 more times

lld-link: error: undefined symbol: __declspec(dllimport) WSACreateEvent
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69102
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: __cdecl perfetto::base::UnixSocketRaw::UnixSocketRaw(class perfetto::base::ScopedResource<unsigned __int64, &int __cdecl perfetto::base::CloseSocket(unsigned __int64), -1, 1, struct perfetto::base::internal::DefaultValidityChecker<unsigned __int64, -1>>, enum perfetto::base::SockFamily, enum perfetto::base::SockType))

lld-link: error: undefined symbol: __declspec(dllimport) WSAEventSelect
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69118
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: void __cdecl perfetto::base::UnixSocketRaw::SetBlocking(bool))
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69122
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: void __cdecl perfetto::base::UnixSocketRaw::SetBlocking(bool))

lld-link: error: undefined symbol: __declspec(dllimport) ioctlsocket
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69120
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: void __cdecl perfetto::base::UnixSocketRaw::SetBlocking(bool))

lld-link: error: undefined symbol: __declspec(dllimport) bind
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69169
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: bool __cdecl perfetto::base::UnixSocketRaw::Bind(class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &))

lld-link: error: undefined symbol: __declspec(dllimport) getaddrinfo
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:68972
>>>               perfetto_sdk.lib(perfetto.cc.obj):(struct base::0xE6D3EB86::`anonymous namespace'::SockaddrAny __cdecl perfetto::base::`anonymous namespace'::MakeSockAddr(enum base::0xE6D3EB86::SockFamily, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &))
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:68990
>>>               perfetto_sdk.lib(perfetto.cc.obj):(struct base::0xE6D3EB86::`anonymous namespace'::SockaddrAny __cdecl perfetto::base::`anonymous namespace'::MakeSockAddr(enum base::0xE6D3EB86::SockFamily, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &))

lld-link: error: undefined symbol: __declspec(dllimport) freeaddrinfo
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:68977
>>>               perfetto_sdk.lib(perfetto.cc.obj):(struct base::0xE6D3EB86::`anonymous namespace'::SockaddrAny __cdecl perfetto::base::`anonymous namespace'::MakeSockAddr(enum base::0xE6D3EB86::SockFamily, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &))
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:68995
>>>               perfetto_sdk.lib(perfetto.cc.obj):(struct base::0xE6D3EB86::`anonymous namespace'::SockaddrAny __cdecl perfetto::base::`anonymous namespace'::MakeSockAddr(enum base::0xE6D3EB86::SockFamily, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &))

lld-link: error: undefined symbol: __declspec(dllimport) listen
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69180
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: bool __cdecl perfetto::base::UnixSocketRaw::Listen(void))

lld-link: error: undefined symbol: __declspec(dllimport) connect
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69189
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: bool __cdecl perfetto::base::UnixSocketRaw::Connect(class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &))

lld-link: error: undefined symbol: __declspec(dllimport) WSAGetLastError
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69191
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: bool __cdecl perfetto::base::UnixSocketRaw::Connect(class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &))
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69818
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: unsigned __int64 __cdecl perfetto::base::UnixSocket::Receive(void *, unsigned __int64, class perfetto::base::ScopedResource<int, &int __cdecl perfetto::base::CloseFile(int), -1, 1, struct perfetto::base::internal::DefaultValidityChecker<int, -1>> *, unsigned __int64))

lld-link: error: undefined symbol: __declspec(dllimport) shutdown
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69204
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: void __cdecl perfetto::base::UnixSocketRaw::Shutdown(void))

lld-link: error: undefined symbol: __declspec(dllimport) sendto
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69218
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: __int64 __cdecl perfetto::base::UnixSocketRaw::Send(void const *, unsigned __int64, int const *, unsigned __int64))

lld-link: error: undefined symbol: __declspec(dllimport) recv
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69226
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: __int64 __cdecl perfetto::base::UnixSocketRaw::Receive(void *, unsigned __int64, class perfetto::base::ScopedResource<int, &int __cdecl perfetto::base::CloseFile(int), -1, 1, struct perfetto::base::internal::DefaultValidityChecker<int, -1>> *, unsigned __int64))

lld-link: error: undefined symbol: __declspec(dllimport) WSAEnumNetworkEvents
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69633
>>>               perfetto_sdk.lib(perfetto.cc.obj):(private: void __cdecl perfetto::base::UnixSocket::OnEvent(void))

lld-link: error: undefined symbol: __declspec(dllimport) accept
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69700
>>>               perfetto_sdk.lib(perfetto.cc.obj):(private: void __cdecl perfetto::base::UnixSocket::OnEvent(void))

lld-link: error: undefined symbol: __declspec(dllimport) WSAStartup
>>> referenced by C:\.conan\2d5c3f\1\sdk\perfetto.cc:69006
>>>               perfetto_sdk.lib(perfetto.cc.obj):(public: <auto> __cdecl `class base::0xE6D3EB86::ScopedResource<unsigned __int64, &int __cdecl perfetto::base::CloseSocket(unsigned __int64), -1, 1, struct perfetto::base::internal::DefaultValidityChecker<unsigned __int64, -1>> __cdecl perfetto::base::`anonymous namespace'::CreateSocketHandle(enum base::0xE6D3EB86::SockFamily, enum base::0xE6D3EB86::SockType)'::`1'::<lambda_157>::operator()(void) const)
ninja: build stopped: subcommand failed.
ERROR: Traceback (most recent call last):
    branch = "releases/v28.x"
    commit = "99ead408d98eaa25b7819c7e059734bea42fa148"
> gn args out/conan-build --list --short
-----------------
_android_toolchain_version = "4.9"
_default_target_sysroot = ""
_target_triplet = ""
android_abi_target = "x86_64-linux-android"
android_api_level = 21
android_app_abi = "x86_64"
android_clangrt_dir = "C:/.conan/b16f0e/1/source_subfolder/buildtools/ndk/toolchains/llvm/prebuilt/UNSUPPORTED_ON_WINDOWS/lib64/clang/9.0.9/lib/linux"
android_compile_sysroot = "C:/.conan/b16f0e/1/source_subfolder/buildtools/ndk/sysroot/usr/include"
android_compile_sysroot_subdir = "x86_64-linux-android"
android_host = "UNSUPPORTED_ON_WINDOWS"
android_link_sysroot_subdir = "platforms/android-21/arch-x86_64"
android_llvm_arch = "x86_64"
android_llvm_dir = "C:/.conan/b16f0e/1/source_subfolder/buildtools/ndk/toolchains/llvm/prebuilt/UNSUPPORTED_ON_WINDOWS"
android_ndk_root = "C:/.conan/b16f0e/1/source_subfolder/buildtools/ndk"
android_prebuilt_arch = "android-x86_64"
android_toolchain_root = "C:/.conan/b16f0e/1/source_subfolder/buildtools/ndk/toolchains/x86_64-4.9/prebuilt/UNSUPPORTED_ON_WINDOWS"
ar = "ar"
cc = "../../buildtools/win/clang/bin\clang-cl.exe"
cc_wrapper = ""
current_cpu = ""
current_os = ""
custom_libcxx_is_static = true
cxx = "../../buildtools/win/clang/bin\clang-cl.exe"
enable_perfetto_benchmarks = false
enable_perfetto_fuzzers = false
enable_perfetto_heapprofd = false
enable_perfetto_integration_tests = false
enable_perfetto_ipc = true
enable_perfetto_llvm_demangle = false
enable_perfetto_platform_services = false
enable_perfetto_stderr_crash_dump = false
enable_perfetto_tools = false
enable_perfetto_trace_processor = false
enable_perfetto_trace_processor_httpd = false
enable_perfetto_trace_processor_json = false
enable_perfetto_trace_processor_linenoise = false
enable_perfetto_trace_processor_percentile = false
enable_perfetto_trace_processor_sqlite = false
enable_perfetto_traceconv = false
enable_perfetto_traced_perf = false
enable_perfetto_traced_probes = false
enable_perfetto_ui = false
enable_perfetto_unittests = false
enable_perfetto_version_gen = true
enable_perfetto_watchdog = false
enable_perfetto_x64_cpu_opt = false
enable_perfetto_zlib = false
extra_cflags = "/W0 -Wno-c99-designator -Wno-unused-parameter -Wno-error "
extra_cxxflags = "/W0 -Wno-c99-designator -Wno-unused-parameter -Wno-error "
extra_host_cflags = ""
extra_host_cxxflags = ""
extra_host_ldflags = ""
extra_ldflags = ""
extra_target_cflags = ""
extra_target_cxxflags = ""
extra_target_ldflags = ""
gcc_toolchain = ""
host_cpu = "x64"
host_os = "win"
is_asan = false
is_clang = true
is_cross_compiling = false
is_debug = true
is_fuzzer = false
is_hermetic_clang = true
is_lsan = false
is_lto = false
is_msan = false
is_perfetto_build_generator = false
is_perfetto_embedder = false
is_system_compiler = false
is_tsan = false
is_ubsan = false
link_fuzzer = ""
linker = "../../buildtools/win/clang/bin\lld-link.exe"
monolithic_binaries = true
perfetto_build_with_android = false
perfetto_enable_git_rev_version_header = true
perfetto_force_dcheck = ""
perfetto_force_dlog = ""
perfetto_use_system_protobuf = false
perfetto_use_system_zlib = false
perfetto_verbose_logs_enabled = true
sanitizer_lib = ""
sanitizer_lib_dir = ""
sanitizer_lib_dir_is_static = false
skip_buildtools_check = false
strip = ""
sysroot = ""
target_ar = "ar"
target_cc = "../../buildtools/win/clang/bin\clang-cl.exe"
target_cpu = ""
target_cxx = "../../buildtools/win/clang/bin\clang-cl.exe"
target_gcc_toolchain = ""
target_linker = "../../buildtools/win/clang/bin\lld-link.exe"
target_os = ""
target_strip = ""
target_sysroot = ""
target_triplet = ""
use_custom_libcxx = false
use_libfuzzer = false
use_sanitizer_configs_without_instrumentation = false
using_sanitizer = false
primiano commented 2 years ago

Hmm this is very weird. the IPC code is built every month on windows and is used as part of traced.exe and other .exe that we publish.

Either you are passing some weird gn args, or this is some weird side effect of something that happens only on the amalgamated SDK build

primiano commented 2 years ago

Actually I know what's going on. You are definitely missing Ws2_32.lib (the winsock library) there. This is where all the socket api come from.

blockspacer commented 2 years ago

@primiano I use amalgamated SDK build and add_library(perfetto STATIC perfetto/sdk/perfetto.cc) from https://perfetto.dev/docs/instrumentation/tracing-sdk

Note that i had to change defines

target_compile_definitions(perfetto_sdk PRIVATE 
  NOMINMAX # WINDOWS: to avoid defining min/max macros
  _WINSOCKAPI_ # WINDOWS: to avoid re-definition in WinSock2.h
)

Without NOMINMAX i get error

perfetto.cc(3090,14): error: expected unqualified-id
        std::min(count - written, static_cast<size_t>(UINT32_MAX)));

Without _WINSOCKAPI_ i get error

In file included from C:\.conan\2d5c3f\1\sdk\perfetto.cc:68837:
In file included from C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\WS2tcpip.h:43:
In file included from C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\winsock2.h:116:
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\shared\ws2def.h(240,16): error: redefinition of 'sockaddr'
typedef struct sockaddr {

Windows 10, clang-cl

primiano commented 2 years ago

Please look at the set of defines that we use in the standalone build in the .gn files

It seemed it was building above (in the initial comment) and the problem was only linking. What changed?

blockspacer commented 2 years ago

I linked Ws2_32.lib and defined NOMINMAX and _WINSOCKAPI_ manually. Issue solved. Thank you very much.