Skip to content

Commit 20f2bf1

Browse files
authored
[Profiler/Crashtracker] Bump libdatadog 16.0.3 (#6589)
1 parent 21aa978 commit 20f2bf1

File tree

17 files changed

+382
-274
lines changed

17 files changed

+382
-274
lines changed

build/cmake/FindLibdatadog.cmake

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@ endif()
44

55
include(FetchContent)
66

7-
set(LIBDATADOG_VERSION "v14.3.1" CACHE STRING "libdatadog version")
7+
set(LIBDATADOG_VERSION "v16.0.3" CACHE STRING "libdatadog version")
88

99
if (CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL arm64)
1010
if (DEFINED ENV{IsAlpine} AND "$ENV{IsAlpine}" MATCHES "true")
11-
set(SHA256_LIBDATADOG "57f83aff275628bb1af89c22bb4bd696726daf2a9e09b6cd0d966b29e65a7ad6" CACHE STRING "libdatadog sha256")
11+
set(SHA256_LIBDATADOG "dd08d3a4dbbd765392121d27b790d7818e80dd28500b554db16e9186b1025ba9" CACHE STRING "libdatadog sha256")
1212
set(FILE_TO_DOWNLOAD libdatadog-aarch64-alpine-linux-musl.tar.gz)
1313
else()
14-
set(SHA256_LIBDATADOG "36db8d50ccabb71571158ea13835c0f1d05d30b32135385f97c16343cfb6ddd4" CACHE STRING "libdatadog sha256")
14+
set(SHA256_LIBDATADOG "decc01a2e0f732cabcc56594429a3dbc13678070e07f24891555dcc02df2e516" CACHE STRING "libdatadog sha256")
1515
set(FILE_TO_DOWNLOAD libdatadog-aarch64-unknown-linux-gnu.tar.gz)
1616
endif()
1717
else()
1818
if (DEFINED ENV{IsAlpine} AND "$ENV{IsAlpine}" MATCHES "true")
19-
set(SHA256_LIBDATADOG "2f61fd21cf2f8147743e414b4a8c77250a17be3aecc42a69ffe54f0a603d5c92" CACHE STRING "libdatadog sha256")
19+
set(SHA256_LIBDATADOG "8e09afd3cfb5ace85501f37b4bd6378299ebbf71189ccc2173169998b75b4b56" CACHE STRING "libdatadog sha256")
2020
set(FILE_TO_DOWNLOAD libdatadog-${CMAKE_SYSTEM_PROCESSOR}-alpine-linux-musl.tar.gz)
2121
else()
22-
set(SHA256_LIBDATADOG "f01f05600591063eba4faf388f54c155ab4e6302e5776c7855e3734955f7daf7" CACHE STRING "libdatadog sha256")
22+
set(SHA256_LIBDATADOG "caaec84fc9afbcb3ec4618791b3c3f1ead65196009e9f07fd382e863dc3bdc66" CACHE STRING "libdatadog sha256")
2323
set(FILE_TO_DOWNLOAD libdatadog-${CMAKE_SYSTEM_PROCESSOR}-unknown-linux-gnu.tar.gz)
2424
endif()
2525
endif()

build/vcpkg_local_ports/libdatadog/portfile.cmake

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ set(LIBDATADOG_VERSION ${VERSION})
33
if(TARGET_TRIPLET STREQUAL "x64-windows" OR
44
TARGET_TRIPLET STREQUAL "x64-windows-static")
55
set(PLATFORM "x64")
6-
set(LIBDATADOG_HASH "872f1567e8137d6e044e204eb0de749271ba64cf140c24f10c40719a24cbd9b8090325353e4c8a0562a4ff03249b48f8435e4fdcefb9032298d6487c7d087298")
6+
set(LIBDATADOG_HASH "3ec847560bd1de86935c230f34cb58d2a0f3f17865349d094e18d3e8edf8518955ede05bf595dc3ca41f99a911760f891bcf58d92fc5c06ce6ad98cdc8f034e3")
77
elseif(TARGET_TRIPLET STREQUAL "x86-windows" OR
88
TARGET_TRIPLET STREQUAL "x86-windows-static")
99
set(PLATFORM "x86")
10-
set(LIBDATADOG_HASH "653826d9852450fcebad49d7f132747326cfaeffefcadab92cbd23783fb33ff7ea81b412704c40e2800f36d5906297249f49e04b798c5c454abd69165204e6ad")
10+
set(LIBDATADOG_HASH "2d884d76a35e4c37d05f6902c16b9e08ce1565976a6c9cf5fbd30273d8bd5385ad2523658eebadb02f90543191e217b028e86722ae7bcc08cbca2c342a5b5e79")
1111
else()
1212
message(FATAL_ERROR "Unsupported triplet: ${TARGET_TRIPLET}")
1313
endif()
@@ -46,4 +46,4 @@ else()
4646
file(INSTALL "${source_path}/${LIBDATADOG_FILENAME}/debug/static/datadog_profiling_ffi.lib" DESTINATION "${CURRENT_PACKAGES_DIR}/debug/lib")
4747
endif()
4848

49-
vcpkg_install_copyright(FILE_LIST "${source_path}/${LIBDATADOG_FILENAME}/LICENSE")
49+
vcpkg_install_copyright(FILE_LIST "${source_path}/${LIBDATADOG_FILENAME}/LICENSE")
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "libdatadog",
3-
"version-string": "14.3.1",
3+
"version-string": "16.0.3",
44
"description": "Package providing libdatadog prebuilt binaries for Windows only.",
55
"dependencies": []
66
}

global.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
"version": "9.0.102",
44
"rollForward": "minor"
55
}
6-
}
6+
}

profiler/src/ProfilerEngine/Datadog.Profiler.Native.Linux/CrashReportingLinux.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ std::vector<ModuleInfo> CrashReportingLinux::GetModules()
132132
moduleBaseAddresses[path] = baseAddress;
133133
}
134134

135-
auto buildId = ElfBuildId(path.data());
135+
auto buildId = BuildId::From(path.data());
136136
modules.push_back(ModuleInfo{ start, end, baseAddress, std::move(path), std::move(buildId) });
137137
}
138138

@@ -222,15 +222,19 @@ std::vector<StackFrame> CrashReportingLinux::GetThreadFrames(int32_t tid, Resolv
222222

223223
auto demangleResult = ddog_crasht_demangle(libdatadog::to_char_slice(stackFrame.method), DDOG_CRASHT_DEMANGLE_OPTIONS_COMPLETE);
224224

225-
if (demangleResult.tag == DDOG_CRASHT_STRING_WRAPPER_RESULT_OK)
225+
if (demangleResult.tag == DDOG_STRING_WRAPPER_RESULT_OK)
226226
{
227-
// TODO: There is currently no safe way to free the StringWrapper
228227
auto stringWrapper = demangleResult.ok;
229228

230229
if (stringWrapper.message.len > 0)
231230
{
232231
stackFrame.method = std::string((char*)stringWrapper.message.ptr, stringWrapper.message.len);
233232
}
233+
ddog_StringWrapper_drop(&demangleResult.ok);
234+
}
235+
else
236+
{
237+
SetLastError(demangleResult.err);
234238
}
235239
}
236240
}

profiler/src/ProfilerEngine/Datadog.Profiler.Native.Linux/CrashReportingLinux.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct ModuleInfo
1717
uintptr_t baseAddress;
1818
std::string path;
1919
// defined in CrashReporting.h
20-
ElfBuildId build_id;
20+
BuildId build_id;
2121
};
2222

2323
class CrashReportingLinux : public CrashReporting

profiler/src/ProfilerEngine/Datadog.Profiler.Native.Windows/CrashReportingWindows.cpp

+17-24
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,7 @@ std::vector<StackFrame> CrashReportingWindows::GetThreadFrames(int32_t tid, Reso
171171
if (module != nullptr)
172172
{
173173
stackFrame.moduleAddress = module->startAddress;
174-
stackFrame.hasPdbInfo = module->hasPdbInfo;
175-
stackFrame.pdbAge = module->pdbAge;
176-
stackFrame.pdbSig = module->pdbSig;
174+
stackFrame.buildId = module->buildId;
177175

178176
std::ostringstream methodName;
179177
methodName << module->path << "!<unknown>+" << std::hex << (nativeStackFrame.AddrPC.Offset - module->startAddress);
@@ -233,10 +231,9 @@ std::vector<ModuleInfo> CrashReportingWindows::GetModules()
233231
resolvedModuleName = moduleName;
234232
}
235233

236-
ModuleInfo module{ (uintptr_t)moduleInfo.lpBaseOfDll, (uintptr_t)moduleInfo.lpBaseOfDll + moduleInfo.SizeOfImage, std::move(resolvedModuleName), false, 0, 0 };
237-
238-
FillPdbInfo((uintptr_t)moduleInfo.lpBaseOfDll, module);
234+
auto buildId = ExtractBuildId((uintptr_t)moduleInfo.lpBaseOfDll);
239235

236+
ModuleInfo module{(uintptr_t)moduleInfo.lpBaseOfDll, (uintptr_t)moduleInfo.lpBaseOfDll + moduleInfo.SizeOfImage, std::move(resolvedModuleName), std::move(buildId)};
240237
modules.push_back(std::move(module));
241238
}
242239
}
@@ -271,35 +268,35 @@ std::vector<BYTE> CrashReportingWindows::ReadRemoteMemory(HANDLE process, uintpt
271268
return {};
272269
}
273270

274-
bool CrashReportingWindows::FillPdbInfo(uintptr_t baseAddress, ModuleInfo& moduleInfo)
271+
BuildId CrashReportingWindows::ExtractBuildId(uintptr_t baseAddress)
275272
{
276273
// Read the DOS header
277274
auto dosHeaderBuffer = _readMemory(baseAddress, sizeof(IMAGE_DOS_HEADER));
278275
if (dosHeaderBuffer.empty())
279276
{
280-
return false;
277+
return {};
281278
}
282279

283280
auto dosHeader = reinterpret_cast<PIMAGE_DOS_HEADER>(dosHeaderBuffer.data());
284281

285282
if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE)
286283
{
287-
return false;
284+
return {};
288285
}
289286

290287
// Read the NT headers
291288
uintptr_t ntHeadersAddress = baseAddress + dosHeader->e_lfanew;
292289
auto ntHeadersBuffer = _readMemory(ntHeadersAddress, sizeof(IMAGE_NT_HEADERS_GENERIC));
293290
if (ntHeadersBuffer.empty())
294291
{
295-
return false;
292+
return {};
296293
}
297294

298295
auto ntHeaders = reinterpret_cast<IMAGE_NT_HEADERS_GENERIC*>(ntHeadersBuffer.data());
299296

300297
if (ntHeaders->Signature != IMAGE_NT_SIGNATURE)
301298
{
302-
return false;
299+
return {};
303300
}
304301

305302
// Check the PE type
@@ -308,7 +305,7 @@ bool CrashReportingWindows::FillPdbInfo(uintptr_t baseAddress, ModuleInfo& modul
308305

309306
if (!isPE32 && !isPE64)
310307
{
311-
return false;
308+
return {};
312309
}
313310

314311
// Read the debug directory according to the PE type
@@ -319,7 +316,7 @@ bool CrashReportingWindows::FillPdbInfo(uintptr_t baseAddress, ModuleInfo& modul
319316
auto header32Buffer = _readMemory(ntHeadersAddress, sizeof(IMAGE_NT_HEADERS32));
320317
if (header32Buffer.empty())
321318
{
322-
return false;
319+
return {};
323320
}
324321

325322
auto header32 = reinterpret_cast<IMAGE_NT_HEADERS32*>(header32Buffer.data());
@@ -330,7 +327,7 @@ bool CrashReportingWindows::FillPdbInfo(uintptr_t baseAddress, ModuleInfo& modul
330327
auto header64Buffer = _readMemory(ntHeadersAddress, sizeof(IMAGE_NT_HEADERS64));
331328
if (header64Buffer.empty())
332329
{
333-
return false;
330+
return {};
334331
}
335332

336333
auto header64 = reinterpret_cast<IMAGE_NT_HEADERS64*>(header64Buffer.data());
@@ -340,13 +337,13 @@ bool CrashReportingWindows::FillPdbInfo(uintptr_t baseAddress, ModuleInfo& modul
340337
uintptr_t debugDirectoryAddress = baseAddress + debugDataDir.VirtualAddress;
341338
if (debugDirectoryAddress == 0)
342339
{
343-
return false;
340+
return {};
344341
}
345342

346343
auto debugDirectoryBuffer = _readMemory(debugDirectoryAddress, debugDataDir.Size);
347344
if (debugDirectoryBuffer.empty())
348345
{
349-
return false;
346+
return {};
350347
}
351348

352349
auto debugDirectory = reinterpret_cast<PIMAGE_DEBUG_DIRECTORY>(debugDirectoryBuffer.data());
@@ -367,10 +364,10 @@ bool CrashReportingWindows::FillPdbInfo(uintptr_t baseAddress, ModuleInfo& modul
367364
// Extract the PDB info from the codeview entry
368365
auto pdbInfoAddress = baseAddress + debugDirectory[i].AddressOfRawData;
369366
auto pdbInfoBuffer = _readMemory(pdbInfoAddress, sizeof(CV_INFO_PDB70));
370-
367+
371368
if (pdbInfoBuffer.empty())
372369
{
373-
return false;
370+
return {};
374371
}
375372

376373
auto pdbInfo = reinterpret_cast<CV_INFO_PDB70*>(pdbInfoBuffer.data());
@@ -379,16 +376,12 @@ bool CrashReportingWindows::FillPdbInfo(uintptr_t baseAddress, ModuleInfo& modul
379376

380377
if (pdbInfo->Signature == PDB70_SIGNATURE)
381378
{
382-
moduleInfo.pdbAge = pdbInfo->Age;
383-
moduleInfo.pdbSig = pdbInfo->Guid;
384-
moduleInfo.hasPdbInfo = true;
385-
386-
return true;
379+
return BuildId::From(pdbInfo->Guid, pdbInfo->Age);
387380
}
388381
}
389382
}
390383

391-
return false;
384+
return {};
392385
}
393386

394387
void CrashReportingWindows::SetMemoryReader(std::function<std::vector<BYTE>(uintptr_t, SIZE_T)> readMemory)

profiler/src/ProfilerEngine/Datadog.Profiler.Native.Windows/CrashReportingWindows.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ struct ModuleInfo
1111
uintptr_t startAddress;
1212
uintptr_t endAddress;
1313
std::string path;
14-
bool hasPdbInfo;
15-
DWORD pdbAge;
16-
GUID pdbSig;
14+
BuildId buildId;
1715
};
1816

1917
// PE32 and PE64 have different optional headers, which complexify the logic to fetch them
@@ -35,7 +33,7 @@ class CrashReportingWindows : public CrashReporting
3533

3634
int32_t STDMETHODCALLTYPE Initialize() override;
3735

38-
bool FillPdbInfo(uintptr_t baseAddress, ModuleInfo& moduleInfo);
36+
BuildId ExtractBuildId(uintptr_t baseAddress);
3937

4038
void SetMemoryReader(std::function<std::vector<BYTE>(uintptr_t, SIZE_T)> readMemory);
4139

0 commit comments

Comments
 (0)