diff --git a/include/sentry.h b/include/sentry.h index 7de351e1b9..3aee57c25f 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -1288,6 +1288,19 @@ SENTRY_API void sentry_options_set_database_pathw( sentry_options_t *opts, const wchar_t *path); SENTRY_API void sentry_options_set_database_pathw_n( sentry_options_t *opts, const wchar_t *path, size_t path_len); + +/** + * Sets the args passed to the process when relaunching after a crash. + * Args must be in 1 single string separated by | + */ +SENTRY_API void sentry_options_set_relaunch_argvw( + sentry_options_t *opts, const wchar_t *relaunch_argv); + +/** + * Gets the args passsed to the process when relaunching after a crash. + */ +SENTRY_API const wchar_t *sentry_options_get_relaunch_argvw( + const sentry_options_t *opts); #endif /** diff --git a/src/backends/sentry_backend_crashpad.cpp b/src/backends/sentry_backend_crashpad.cpp index ef63ac3028..931559185a 100644 --- a/src/backends/sentry_backend_crashpad.cpp +++ b/src/backends/sentry_backend_crashpad.cpp @@ -420,25 +420,28 @@ crashpad_backend_startup( std::vector attachments; sentry_path_t *current_exe = sentry__path_current_exe(); - if (current_exe && options->relaunch_argv) { - annotations["__td-crashed-pid"] = std::to_string(td__getpid()); - annotations["__td-relaunch-argv"] = std::string(options->relaunch_argv); + if (current_exe) { + if (options->relaunch_argv) { + annotations["__td-relaunch-argv"] + = std::string(options->relaunch_argv); + annotations["__td-relaunch-path"] = std::string(current_exe->path); + } #ifdef SENTRY_PLATFORM_WINDOWS - std::wstring wstrPath(current_exe->path); - std::string strPath; - std::transform(wstrPath.begin(), wstrPath.end(), - std::back_inserter(strPath), [](wchar_t c) { return (char)c; }); - - annotations["__td-relaunch-path"] = strPath; -#else - annotations["__td-relaunch-path"] = std::string(current_exe->path); + if (options->relaunch_argvw) { + annotations["__td-relaunch-argv"] = std::string { + sentry__string_from_wstr(options->relaunch_argvw) + }; + annotations["__td-relaunch-path"] + = std::string { sentry__string_from_wstr(current_exe->path) }; + } #endif + annotations["__td-crashed-pid"] = std::to_string(td__getpid()); sentry__path_free(current_exe); } // register attachments for (sentry_attachment_t *attachment = options->attachments; attachment; - attachment = attachment->next) { + attachment = attachment->next) { attachments.emplace_back(attachment->path->path); } diff --git a/src/sentry_options.c b/src/sentry_options.c index 9f916a0c5c..e73d2a32a2 100644 --- a/src/sentry_options.c +++ b/src/sentry_options.c @@ -85,6 +85,9 @@ sentry_options_free(sentry_options_t *opts) } sentry__dsn_decref(opts->dsn); sentry_free(opts->release); +#ifdef SENTRY_PLATFORM_WINDOWS + sentry_free(opts->relaunch_argvw); +#endif sentry_free(opts->relaunch_argv); sentry_free(opts->sdk_name); sentry_free(opts->user_agent); @@ -550,6 +553,22 @@ sentry_options_set_database_pathw(sentry_options_t *opts, const wchar_t *path) size_t path_len = path ? wcslen(path) : 0; sentry_options_set_database_pathw_n(opts, path, path_len); } + +void +sentry_options_set_relaunch_argvw( + sentry_options_t *opts, const wchar_t *relaunch_argvw) +{ + sentry_free(opts->relaunch_argvw); + size_t len = relaunch_argvw ? wcslen(relaunch_argvw) : 0; + const auto clonedPath = sentry__path_from_wstr_n(relaunch_argvw, len); + opts->relaunch_argvw = clonedPath->path; +} + +const wchar_t * +sentry_options_get_relaunch_argvw(const sentry_options_t *opts) +{ + return opts->relaunch_argvw; +} #endif /** diff --git a/src/sentry_options.h b/src/sentry_options.h index 76fe04a4a7..0d7163a9e3 100644 --- a/src/sentry_options.h +++ b/src/sentry_options.h @@ -38,6 +38,9 @@ typedef struct sentry_options_s { char *http_proxy; char *ca_certs; char *transport_thread_name; +#ifdef SENTRY_PLATFORM_WINDOWS + wchar_t *relaunch_argvw; +#endif char *relaunch_argv; char *sdk_name; char *user_agent;