Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## Unreleased

**Features**:

- Native: add Android support. ([#1725](https://github.com/getsentry/sentry-native/pull/1725))

**Fixes**:

- Protect CMAKE_SYSTEM_VERSION to avoid empty values when cross-building. ([#1720](https://github.com/getsentry/sentry-native/pull/1720))
Expand Down
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -841,6 +841,11 @@ elseif(SENTRY_BACKEND_NATIVE)
${PROJECT_SOURCE_DIR}/src
${PROJECT_SOURCE_DIR}/src/backends/native
)
if(SENTRY_WITH_LIBUNWINDSTACK)
target_include_directories(sentry-crash PRIVATE
${PROJECT_SOURCE_DIR}/external/libunwindstack-ndk/include
)
endif()

# Link same libraries as sentry
target_link_libraries(sentry-crash PRIVATE ${_SENTRY_PLATFORM_LIBS})
Expand Down
2 changes: 1 addition & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ elseif(SENTRY_BACKEND_NATIVE)
target_include_directories(sentry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/backends/native)

# Platform-specific libraries for native backend
if(LINUX OR ANDROID)
if(LINUX AND NOT ANDROID)
# Linux needs pthread and rt for shared memory
target_link_libraries(sentry PRIVATE pthread rt)
elseif(APPLE)
Expand Down
47 changes: 39 additions & 8 deletions src/backends/native/sentry_crash_daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -3237,7 +3237,11 @@ daemon_file_logger(
fflush(log_file); // Flush immediately to ensure logs are written
}

#if defined(SENTRY_PLATFORM_LINUX) || defined(SENTRY_PLATFORM_ANDROID)
#if defined(SENTRY_PLATFORM_ANDROID)
int
sentry__crash_daemon_main(pid_t app_pid, uint64_t app_tid, int notify_eventfd,
int ready_eventfd, int shm_fd)
#elif defined(SENTRY_PLATFORM_LINUX)
int
sentry__crash_daemon_main(
pid_t app_pid, uint64_t app_tid, int notify_eventfd, int ready_eventfd)
Expand All @@ -3253,7 +3257,10 @@ sentry__crash_daemon_main(pid_t app_pid, uint64_t app_tid, HANDLE event_handle,
{
// Initialize IPC first (attach to shared memory created by parent)
// We need this to get the database path for logging
#if defined(SENTRY_PLATFORM_LINUX) || defined(SENTRY_PLATFORM_ANDROID)
#if defined(SENTRY_PLATFORM_ANDROID)
sentry_crash_ipc_t *ipc = sentry__crash_ipc_init_daemon(
app_pid, app_tid, notify_eventfd, ready_eventfd, shm_fd);
#elif defined(SENTRY_PLATFORM_LINUX)
sentry_crash_ipc_t *ipc = sentry__crash_ipc_init_daemon(
app_pid, app_tid, notify_eventfd, ready_eventfd);
#elif defined(SENTRY_PLATFORM_MACOS)
Expand Down Expand Up @@ -3532,7 +3539,11 @@ sentry__crash_daemon_main(pid_t app_pid, uint64_t app_tid, HANDLE event_handle,
return 0;
}

#if defined(SENTRY_PLATFORM_LINUX) || defined(SENTRY_PLATFORM_ANDROID)
#if defined(SENTRY_PLATFORM_ANDROID)
pid_t
sentry__crash_daemon_start(pid_t app_pid, uint64_t app_tid, int notify_eventfd,
int ready_eventfd, int shm_fd, const char *handler_path)
#elif defined(SENTRY_PLATFORM_LINUX)
pid_t
sentry__crash_daemon_start(pid_t app_pid, uint64_t app_tid, int notify_eventfd,
int ready_eventfd, const char *handler_path)
Expand Down Expand Up @@ -3653,6 +3664,12 @@ sentry__crash_daemon_start(pid_t app_pid, uint64_t app_tid, HANDLE event_handle,
if (ready_flags != -1) {
fcntl(ready_eventfd, F_SETFD, ready_flags & ~FD_CLOEXEC);
}
# if defined(SENTRY_PLATFORM_ANDROID)
int shm_flags = fcntl(shm_fd, F_GETFD);
if (shm_flags != -1) {
fcntl(shm_fd, F_SETFD, shm_flags & ~FD_CLOEXEC);
}
# endif

// Convert arguments to strings for exec
char pid_str[32], tid_str[32], notify_str[32], ready_str[32];
Expand All @@ -3661,8 +3678,15 @@ sentry__crash_daemon_start(pid_t app_pid, uint64_t app_tid, HANDLE event_handle,
snprintf(notify_str, sizeof(notify_str), "%d", notify_eventfd);
snprintf(ready_str, sizeof(ready_str), "%d", ready_eventfd);

# if defined(SENTRY_PLATFORM_ANDROID)
char shm_str[32];
snprintf(shm_str, sizeof(shm_str), "%d", shm_fd);
char *argv[] = { "sentry-crash", pid_str, tid_str, notify_str,
ready_str, shm_str, NULL };
# else
char *argv[]
= { "sentry-crash", pid_str, tid_str, notify_str, ready_str, NULL };
# endif

if (!sentry__string_empty(handler_path)) {
execv(handler_path, argv);
Expand Down Expand Up @@ -3830,12 +3854,13 @@ main(int argc, char **argv)
{
// Expected arguments:
// Linux: <app_pid> <app_tid> <notify_handle> <ready_handle>
// macOS: <app_pid> <app_tid> <notify_handle> <ready_handle> <shm_fd>
# if defined(SENTRY_PLATFORM_MACOS)
// macOS/Android: <app_pid> <app_tid> <notify_handle> <ready_handle>
// <shm_fd>
# if defined(SENTRY_PLATFORM_MACOS) || defined(SENTRY_PLATFORM_ANDROID)
if (argc < 6) {
fprintf(stderr,
"Usage: sentry-crash <app_pid> <app_tid> <notify_pipe> "
"<ready_pipe> <shm_fd>\n");
"Usage: sentry-crash <app_pid> <app_tid> <notify_handle> "
"<ready_handle> <shm_fd>\n");
return 1;
}
# else
Expand All @@ -3851,7 +3876,13 @@ main(int argc, char **argv)
pid_t app_pid = (pid_t)strtoul(argv[1], NULL, 10);
uint64_t app_tid = strtoull(argv[2], NULL, 16);

# if defined(SENTRY_PLATFORM_LINUX) || defined(SENTRY_PLATFORM_ANDROID)
# if defined(SENTRY_PLATFORM_ANDROID)
int notify_eventfd = atoi(argv[3]);
int ready_eventfd = atoi(argv[4]);
int shm_fd_arg = atoi(argv[5]);
return sentry__crash_daemon_main(
app_pid, app_tid, notify_eventfd, ready_eventfd, shm_fd_arg);
# elif defined(SENTRY_PLATFORM_LINUX)
int notify_eventfd = atoi(argv[3]);
int ready_eventfd = atoi(argv[4]);
return sentry__crash_daemon_main(
Expand Down
11 changes: 9 additions & 2 deletions src/backends/native/sentry_crash_daemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ struct sentry_options_s;
* @param ready_handle Ready signal handle
* @return Daemon PID on success, -1 on failure
*/
#if defined(SENTRY_PLATFORM_LINUX) || defined(SENTRY_PLATFORM_ANDROID)
#if defined(SENTRY_PLATFORM_ANDROID)
pid_t sentry__crash_daemon_start(pid_t app_pid, uint64_t app_tid,
int notify_eventfd, int ready_eventfd, int shm_fd,
const char *handler_path);
#elif defined(SENTRY_PLATFORM_LINUX)
pid_t sentry__crash_daemon_start(pid_t app_pid, uint64_t app_tid,
int notify_eventfd, int ready_eventfd, const char *handler_path);
#elif defined(SENTRY_PLATFORM_MACOS)
Expand All @@ -44,7 +48,10 @@ pid_t sentry__crash_daemon_start(pid_t app_pid, uint64_t app_tid,
* @param notify_handle Notification handle for crash signals
* @param ready_handle Ready signal handle to signal parent
*/
#if defined(SENTRY_PLATFORM_LINUX) || defined(SENTRY_PLATFORM_ANDROID)
#if defined(SENTRY_PLATFORM_ANDROID)
int sentry__crash_daemon_main(pid_t app_pid, uint64_t app_tid,
int notify_eventfd, int ready_eventfd, int shm_fd);
#elif defined(SENTRY_PLATFORM_LINUX)
int sentry__crash_daemon_main(
pid_t app_pid, uint64_t app_tid, int notify_eventfd, int ready_eventfd);
#elif defined(SENTRY_PLATFORM_MACOS)
Expand Down
6 changes: 3 additions & 3 deletions src/backends/native/sentry_crash_handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -693,9 +693,9 @@ crash_signal_handler(int signum, siginfo_t *info, void *context)
// Dump daemon log for debugging (uses stdio, safe after page allocator
// enabled)
// Extract the shm identifier for log path construction
// macOS: shm_path = "{tmpdir}/.sentry-shm-{id}", Linux: shm_name =
// "/s-{id}"
# if defined(SENTRY_PLATFORM_MACOS)
// macOS/Android: shm_path = "{tmpdir}/.sentry-shm-{id}", Linux:
// shm_name = "/s-{id}"
# if defined(SENTRY_PLATFORM_MACOS) || defined(SENTRY_PLATFORM_ANDROID)
const char *shm_id_src = ipc ? ipc->shm_path : "";
# else
const char *shm_id_src = ipc ? ipc->shm_name : "";
Expand Down
Loading
Loading