[Lldb-commits] [PATCH] D131110: [lldb] Make LLDB resilient against failing dyld introspection APIs
Jonas Devlieghere via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed Aug 3 15:08:32 PDT 2022
JDevlieghere updated this revision to Diff 449795.
JDevlieghere marked 2 inline comments as done.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D131110/new/
https://reviews.llvm.org/D131110
Files:
lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm
Index: lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm
===================================================================
--- lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm
+++ lldb/source/Host/macosx/objcxx/HostInfoMacOSX.mm
@@ -16,6 +16,7 @@
#include "lldb/Utility/Timer.h"
#include "Utility/UuidCompatibility.h"
+#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/Support/FileSystem.h"
@@ -529,34 +530,39 @@
#if defined(SDK_HAS_NEW_DYLD_INTROSPECTION_SPIS)
if (__builtin_available(macOS 12, *)) {
if (dyld_process_create_for_current_task) {
- auto dyld_process = dyld_process_create_for_current_task();
- auto snapshot =
- dyld_process_snapshot_create_for_process(dyld_process, nullptr);
- auto shared_cache = dyld_process_snapshot_get_shared_cache(snapshot);
- assert(dyld_process && snapshot && shared_cache);
-
- dyld_shared_cache_for_each_image(shared_cache, ^(dyld_image_t image) {
- __block uint64_t minVmAddr = UINT64_MAX;
- __block uint64_t maxVmAddr = 0;
- uuid_t uuidStore;
- __block uuid_t *uuid = &uuidStore;
-
- dyld_image_for_each_segment_info(image, ^(const char *segmentName,
- uint64_t vmAddr,
- uint64_t vmSize, int perm) {
- minVmAddr = std::min(minVmAddr, vmAddr);
- maxVmAddr = std::max(maxVmAddr, vmAddr + vmSize);
- dyld_image_copy_uuid(image, uuid);
- });
- assert(minVmAddr != UINT_MAX);
- assert(maxVmAddr != 0);
- m_images[dyld_image_get_installname(image)] = SharedCacheImageInfo{
- UUID::fromData(uuid, 16),
- std::make_shared<DataBufferUnowned>((uint8_t *)minVmAddr,
- maxVmAddr - minVmAddr)};
- });
- dyld_process_snapshot_dispose(snapshot);
- return;
+ if (auto dyld_process = dyld_process_create_for_current_task()) {
+ if (auto snapshot = dyld_process_snapshot_create_for_process(
+ dyld_process, nullptr)) {
+ auto on_exit = llvm::make_scope_exit(
+ [&]() { dyld_process_snapshot_dispose(snapshot); });
+ if (auto shared_cache =
+ dyld_process_snapshot_get_shared_cache(snapshot)) {
+ dyld_shared_cache_for_each_image(
+ shared_cache, ^(dyld_image_t image) {
+ __block uint64_t minVmAddr = UINT64_MAX;
+ __block uint64_t maxVmAddr = 0;
+ uuid_t uuidStore;
+ __block uuid_t *uuid = &uuidStore;
+
+ dyld_image_for_each_segment_info(
+ image, ^(const char *segmentName, uint64_t vmAddr,
+ uint64_t vmSize, int perm) {
+ minVmAddr = std::min(minVmAddr, vmAddr);
+ maxVmAddr = std::max(maxVmAddr, vmAddr + vmSize);
+ dyld_image_copy_uuid(image, uuid);
+ });
+ assert(minVmAddr != UINT_MAX);
+ assert(maxVmAddr != 0);
+ m_images[dyld_image_get_installname(image)] =
+ SharedCacheImageInfo{
+ UUID::fromData(uuid, 16),
+ std::make_shared<DataBufferUnowned>(
+ (uint8_t *)minVmAddr, maxVmAddr - minVmAddr)};
+ });
+ return;
+ }
+ }
+ }
}
}
#endif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D131110.449795.patch
Type: text/x-patch
Size: 3599 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20220803/a9d2d7ff/attachment.bin>
More information about the lldb-commits
mailing list