Skip to content

Commit b8cb13d

Browse files
committed
Tracing code is going to live in a separate DSO
The same library will be used by marshal methods tracing (by linking it into `libxamarin-app.so` when tracing is enabled) or will be used by `libmonodroid.so` (or p/invoked from managed land) if desired.
1 parent 8c1b27f commit b8cb13d

File tree

5 files changed

+417
-19
lines changed

5 files changed

+417
-19
lines changed

src/monodroid/CMakeLists.txt

Lines changed: 65 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,19 @@ if(ENABLE_NET)
205205
if(ANDROID_ABI MATCHES "^arm64-v8a")
206206
set(NET_RUNTIME_DIR "${NETCORE_APP_RUNTIME_DIR_ARM64}")
207207
set(COMPILER_BUILTINS_LIB_ABI "aarch64")
208+
set(SYSROOT_ABI_LIB_DIR "aarch64-linux-android")
208209
elseif(ANDROID_ABI MATCHES "^armeabi-v7a")
209210
set(NET_RUNTIME_DIR "${NETCORE_APP_RUNTIME_DIR_ARM}")
210211
set(COMPILER_BUILTINS_LIB_ABI "arm")
212+
set(SYSROOT_ABI_LIB_DIR "arm-linux-androideabi")
211213
elseif(ANDROID_ABI MATCHES "^x86_64")
212214
set(NET_RUNTIME_DIR "${NETCORE_APP_RUNTIME_DIR_X86_64}")
213215
set(COMPILER_BUILTINS_LIB_ABI "x86_64")
216+
set(SYSROOT_ABI_LIB_DIR "x86_64-linux-android")
214217
elseif(ANDROID_ABI MATCHES "^x86")
215218
set(NET_RUNTIME_DIR "${NETCORE_APP_RUNTIME_DIR_X86}")
216219
set(COMPILER_BUILTINS_LIB_ABI "i686")
220+
set(SYSROOT_ABI_LIB_DIR "i686-linux-android")
217221
else()
218222
message(FATAL "${ANDROID_ABI} is not supported for .NET 6+ builds")
219223
endif()
@@ -495,6 +499,7 @@ endif()
495499
set(XAMARIN_INTERNAL_API_LIB xa-internal-api${CHECKED_BUILD_INFIX})
496500
set(XAMARIN_DEBUG_APP_HELPER_LIB xamarin-debug-app-helper${CHECKED_BUILD_INFIX})
497501
set(XAMARIN_APP_STUB_LIB xamarin-app)
502+
set(XAMARIN_NATIVE_TRACING_LIB xamarin-native-tracing)
498503
set(XAMARIN_MARSHAL_METHODS_TRACING_LIB marshal-methods-tracing)
499504

500505
string(TOLOWER ${CMAKE_BUILD_TYPE} XAMARIN_MONO_ANDROID_SUFFIX)
@@ -563,6 +568,14 @@ if(UNIX)
563568
endif()
564569

565570
if(ANDROID AND ENABLE_NET)
571+
set(NATIVE_TRACING_SOURCES
572+
${NDK_CXX_LIBCPPABI_SOURCE_PATH}/src/cxa_demangle.cpp
573+
${SOURCES_DIR}/cxx-abi/string.cc
574+
${SOURCES_DIR}/cxx-abi/terminate.cc
575+
${SOURCES_DIR}/helpers.cc
576+
${SOURCES_DIR}/native-tracing.cc
577+
${SOURCES_DIR}/new_delete.cc
578+
)
566579

567580
set(MARSHAL_METHODS_TRACING_SOURCES
568581
${NDK_CXX_LIBCPPABI_SOURCE_PATH}/src/cxa_demangle.cpp
@@ -712,8 +725,57 @@ add_library(
712725

713726
if(ANDROID)
714727
if(ENABLE_NET AND NOT DEBUG_BUILD)
715-
# TODO: make it a shared library instead, will make it possible to not require NDK when building
716-
# an app with tracing
728+
execute_process(
729+
COMMAND ${CMAKE_CXX_COMPILER} -print-runtime-dir
730+
RESULT_VARIABLE _CXX_COMPILER_EXIT_CODE
731+
OUTPUT_VARIABLE _CXX_COMPILER_RUNTIME_DIR
732+
ECHO_OUTPUT_VARIABLE
733+
OUTPUT_STRIP_TRAILING_WHITESPACE
734+
)
735+
736+
if(NOT ${_CXX_COMPILER_EXIT_CODE} EQUAL 0)
737+
message(FATAL_ERROR "Unable to determine compiler runtime directory")
738+
endif()
739+
740+
message(STATUS "Clang runtime dir: ${_CXX_COMPILER_RUNTIME_DIR}")
741+
message(STATUS "ABI dir: ${SYSROOT_ABI_LIB_DIR}")
742+
set(BUILTINS_LIB ${_CXX_COMPILER_RUNTIME_DIR}/libclang_rt.builtins-${COMPILER_BUILTINS_LIB_ABI}-android.a)
743+
set(CPP_ABI_PATH ${CMAKE_SYSROOT}/usr/lib/${SYSROOT_ABI_LIB_DIR}/libc++abi.a)
744+
745+
add_library(
746+
${XAMARIN_NATIVE_TRACING_LIB}
747+
SHARED ${NATIVE_TRACING_SOURCES}
748+
)
749+
750+
target_include_directories(
751+
${XAMARIN_NATIVE_TRACING_LIB} BEFORE
752+
PRIVATE
753+
${LIBUNWIND_SOURCE_DIR}/include
754+
${LIBUNWIND_HEADERS_DIR}/${CMAKE_ANDROID_ARCH_ABI}
755+
${NDK_CXX_LIBCPPABI_SOURCE_PATH}/include
756+
)
757+
758+
target_compile_options(
759+
${XAMARIN_NATIVE_TRACING_LIB}
760+
PRIVATE
761+
# Avoid the 'warning: dynamic exception specifications are deprecated' warning from libc++ headers
762+
-Wno-deprecated-dynamic-exception-spec
763+
)
764+
765+
target_link_libraries(
766+
${XAMARIN_NATIVE_TRACING_LIB}
767+
PRIVATE
768+
-llog
769+
${CPP_ABI_PATH}
770+
${XA_LIBRARY_OUTPUT_DIRECTORY}/libunwind_xamarin.a
771+
)
772+
773+
target_compile_definitions(
774+
${XAMARIN_NATIVE_TRACING_LIB}
775+
PRIVATE
776+
XAMARIN_TRACING
777+
)
778+
717779
add_library(
718780
${XAMARIN_MARSHAL_METHODS_TRACING_LIB}
719781
STATIC ${MARSHAL_METHODS_TRACING_SOURCES}
@@ -722,7 +784,7 @@ if(ANDROID)
722784
target_compile_definitions(
723785
${XAMARIN_MARSHAL_METHODS_TRACING_LIB}
724786
PRIVATE
725-
MARSHAL_METHODS_TRACING
787+
XAMARIN_TRACING
726788
)
727789

728790
target_compile_options(
@@ -740,20 +802,6 @@ if(ANDROID)
740802
${NDK_CXX_LIBCPPABI_SOURCE_PATH}/include
741803
)
742804

743-
execute_process(
744-
COMMAND ${CMAKE_CXX_COMPILER} -print-runtime-dir
745-
RESULT_VARIABLE _CXX_COMPILER_EXIT_CODE
746-
OUTPUT_VARIABLE _CXX_COMPILER_RUNTIME_DIR
747-
ECHO_OUTPUT_VARIABLE
748-
OUTPUT_STRIP_TRAILING_WHITESPACE
749-
)
750-
751-
if(NOT ${_CXX_COMPILER_EXIT_CODE} EQUAL 0)
752-
message(FATAL_ERROR "Unable to determine compiler runtime directory")
753-
endif()
754-
755-
message(STATUS "Runtime dir: ${_CXX_COMPILER_RUNTIME_DIR}")
756-
set(BUILTINS_LIB ${_CXX_COMPILER_RUNTIME_DIR}/libclang_rt.builtins-${COMPILER_BUILTINS_LIB_ABI}-android.a)
757805
file(COPY ${BUILTINS_LIB} DESTINATION ${XA_LIBRARY_OUTPUT_DIRECTORY})
758806
endif()
759807

src/monodroid/jni/marshal-methods-tracing.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ static void get_java_backtrace (JNIEnv *env, std::string &trace) noexcept
199199

200200
for (jsize i = 0; i < nframes; i++) {
201201
jobject frame = env->GetObjectArrayElement (stack_trace_array, i);
202-
auto frame_desc_java = static_cast<jstring>(env->CallNonvirtualObjectMethod (frame, java_lang_StackTraceElement, java_lang_StackTraceElement_toString));
202+
auto frame_desc_java = static_cast<jstring>(env->CallObjectMethod (frame, java_lang_StackTraceElement_toString));
203203
const char *frame_desc = env->GetStringUTFChars (frame_desc_java, nullptr);
204204

205205
trace.append ("\n");

0 commit comments

Comments
 (0)