پرش به مطلب اصلی

فایل‌های دیباگ و نمادگشایی نیتیو

بیلد انتشار یک برنامهٔ موبایل یا نیتیو، نام‌ها را با خودش ندارد. کرش iOS یا NDK اندروید آدرس دستورالعمل گزارش می‌دهد و برنامهٔ اندرویدی که با R8 مینیفای شده a.b.c.d. فایل‌های دیباگ همان چیزی‌اند که این‌ها را به کد شما برمی‌گردانند — همتای نیتیو سورس‌مپ.

ارورا آن‌ها را هنگام دریافت و پیش از گروه‌بندی اعمال می‌کند، پس خطاها روی نام واقعی توابع گروه می‌شوند که از بیلدی به بیلد دیگر ثابت می‌ماند.

چه چیزهایی حل می‌شوند​

  • فریم‌های نیتیو (کرش‌های iOS و NDK اندروید) ← نام تابع، فایل و خط. نام‌های C++ و Swift دی‌منگل می‌شوند و فریم‌های inline‌شده به فریم‌های جداگانه باز می‌شوند.
  • فریم‌های جاوا/کاتلین بیلد R8/ProGuard ← کلاس، متد، فایل و خط اصلی، همراه با بازشدن متدهای inline‌شده. نام کلاس استثناهای مبهم‌شده هم برگردانده می‌شود.
  • پروفایل‌ها: فریم‌های پروفایل iOS با dSYM نمادگشایی می‌شوند و نام متدهای پروفایل اندروید از روی نگاشت ProGuard برگردانده می‌شود — نگاه کنید به پروفایلینگ.

قالب‌های پشتیبانی‌شده​

قالبپلتفرماز کجا می‌آید
dSYM (Mach-O DWARF)iOS، macOSXcode، با Debug Information Format = DWARF with dSYM File
ELF (.so strip‌نشده)NDK اندروید، لینوکسکتابخانه‌های میانی و strip‌نشدهٔ بیلد NDK
Breakpad (.sym)هر برنامهٔ نیتیوdump_syms
PDBویندوزلینکر MSVC
فایل mapping.txt از ProGuard/R8اندروید (جاوا/کاتلین)app/build/outputs/mapping/<variant>/mapping.txt

فایل چطور تطبیق داده می‌شود​

هر فایل با یک شناسهٔ دیباگ (debug id) شناخته می‌شود، نه با نام یا نسخه:

  • فایل‌های نیتیو شناسه را درون خود باینری دارند (UUID در Mach-O، build id در ELF، امضای PDB، شناسهٔ ماژول Breakpad). SDK شناسهٔ دیباگ همهٔ ایمیج‌های بارگذاری‌شده در پروسهٔ کرش‌کرده را گزارش می‌دهد و آدرس هر فریم با فایلی که همان شناسه را دارد حل می‌شود.
  • نگاشت‌های ProGuard با یک UUID تطبیق داده می‌شوند که پلاگین Gradle روی برنامه می‌زند و SDK همراه هر رویداد گزارشش می‌کند.

پس فایل باید از همان بیلدی باشد که کرش کرده. بیلد دوبارهٔ همان کامیت، شناسه‌های دیباگ تازه می‌سازد و کرش‌های قبلی با فایل‌های جدید جور نمی‌شوند.

بارگذاری​

از ابزارهای رسمی Sentry بدون تغییر استفاده کنید — ارورا همان نقاط بارگذاری‌ای را پیاده کرده که sentry-cli با آن‌ها حرف می‌زند. فقط با چهار تنظیم آن را به ارورا وصل کنید:

تنظیممقدار
SENTRY_URLhttps://<your-errora-host>
SENTRY_AUTH_TOKENیک توکن دسترسی شخصی ارورا (errora_pat_…)
SENTRY_ORGشناسهٔ متنی (slug) سازمان (از آدرس /organizations/<slug>/…)
SENTRY_PROJECTشناسهٔ متنی پروژه

همین مقادیر را می‌شود در .sentryclirc (url، org، project، token) یا بلوک sentry {} در Gradle هم گذاشت. صاحب توکن باید در سازمان نقش member یا بالاتر داشته باشد.

sentry-cli​

# dSYM، ELF، Breakpad و PDB — یک فایل یا یک پوشه بدهید
sentry-cli debug-files upload path/to/build/

# نگاشت ProGuard/R8
sentry-cli upload-proguard --uuid <uuid> app/build/outputs/mapping/release/mapping.txt

به تفکیک پلتفرم​

  • اندروید — پلاگین Gradle سنتری در هر بیلد انتشار، نگاشت و سیمبل‌های NDK را بارگذاری می‌کند و UUID پروگارد را خودش روی برنامه می‌زند. نگاه کنید به اندروید.
  • iOS — یک فاز بیلد Run Script در Xcode که sentry-cli debug-files upload را اجرا می‌کند، یا اکشن sentry_debug_files_upload در fastlane. نگاه کنید به iOS.

از مرورگر​

در تنظیمات ← فایل‌های دیباگ می‌توانید فایل را دستی بارگذاری کنید و فایل‌های موجود را ببینید، دانلود یا حذف کنید. فایل‌های نیتیو شناسهٔ دیباگ خودشان را دارند. برای نگاشت ProGuard، فیلد اختیاری شناسهٔ دیباگ را با UUIDی پر کنید که برنامه‌تان گزارش می‌کند تا نگاشت با رویدادهایش جور شود.

خواندن خطایی که فایل دیباگ ندارد​

فریمی که فایل دیباگش نیست نگه داشته می‌شود، نه حذف، و به‌عنوان نمادگشایی‌نشده علامت می‌خورد. صفحهٔ خطا شناسه‌های دیباگ گمشده را — همراه با ایمیج یا نگاشتی که هرکدام به آن تعلق دارد — فهرست می‌کند تا دقیقاً بدانید کدام فایل را باید بارگذاری کنید.

فایل‌های دیباگ فقط روی رویدادهایی اثر دارند که بعد از بارگذاری می‌رسند: فایل را بارگذاری کنید و منتظر رخداد بعدی بمانید.

خودمیزبانی​

تنظیمپیش‌فرضمعنی
DEBUG_FILES_STORAGEfilesystemfilesystem فایل‌ها را روی دیسک در DEBUG_FILES_ROOT نگه می‌دارد؛ s3 در یک باکت سازگار با S3
DEBUG_FILES_ROOTbackend/var/debug-filesمحل فایل‌ها در حالت filesystem. اگر ورکرهای دریافت روی چند میزبان اجرا می‌شوند، باید یک حجم اشتراکی باشد — یا از s3 استفاده کنید
DEBUG_FILES_S3_BUCKET، DEBUG_FILES_S3_ENDPOINT_URL، DEBUG_FILES_S3_REGION—باکت ذخیره‌سازی در حالت s3 (هر سرویس سازگار با S3)
DEBUG_FILES_S3_ACCESS_KEY، DEBUG_FILES_S3_SECRET_KEY—کلیدهای دسترسی آن — در یک secret نگه دارید
DEBUG_FILES_S3_PREFIXdebug-filesپیشوند کلیدها در باکت
DEBUG_FILES_CACHE_DIRپوشهٔ موقت سیستمدر حالت s3 هر ورکر فایل‌هایی را که با آن‌ها نمادگشایی می‌کند این‌جا نگه می‌دارد (بدون نیاز به حجم)
DEBUG_FILES_CACHE_MAX_BYTES۲ گیگابایتاندازهٔ این کش؛ فایل‌هایی که مدت‌ها استفاده نشده‌اند اول حذف می‌شوند
DEBUG_FILE_UPLOAD_MAX_BYTES۵۰۰ مگابایتسقف حجم هر بارگذاری از مرورگر

در حالت s3 ورکرها بی‌حالت‌اند: چیزی لازم نیست mount شود و پادِ جایگزین، فایل‌های لازم را در اولین استفاده دوباره دانلود می‌کند.

تکه‌های بارگذاری که sentry-cli جا می‌گذارد هر شب پاک‌سازی می‌شوند.

محدودیت‌ها​

  • مینی‌دامپ‌ها (Breakpad، Crashpad، sentry-native) مثل سنتری روی سرور پشته‌کاوی (stack-walk) می‌شوند، با ابزار minidump-stackwalk از rust-minidump (در ایمیج Docker هست؛ برای ایمیج سفارشی MINIDUMP_STACKWALK را تنظیم کنید). فایل‌های دیباگ باینری‌ها را بارگذاری کنید تا پشته‌کاوی از اطلاعات unwind آن‌ها استفاده کند؛ بدون آن‌ها به frame pointer و جست‌وجوی پشته برمی‌گردد و هر فریم نشان می‌دهد چطور پیدا شده (context، cfi، fp، scan).
  • نام‌های Swift با کتابخانهٔ زمان اجرای Swift (libswiftCore) دی‌منگل می‌شوند که در ایمیج Docker وجود دارد؛ ایمیجی که بدون آن ساخته شود نمادهای Swift را منگل‌شده ($s7MyApp…) نشان می‌دهد. C++ همیشه دی‌منگل می‌شود.
  • فریم‌های بدون شمارهٔ خط (پروفایل‌های اندروید) مثل سنتری حل می‌شوند: اگر فریم امضای متد را داشته باشد با نوع پارامترها، وگرنه با نام — پس نام مبهم‌شده‌ای که به چند متد با پارامترهای یکسان اشاره کند همان‌طور می‌ماند.

عیب‌یابی​

نشانهعلت / راه‌حل
فریم‌ها هنوز آدرس یا a.b.c هستندفایل همان بیلد بارگذاری نشده — شناسهٔ دیباگ گمشده در صفحهٔ خطا را با فایل‌های دیباگ مقایسه کنید
فایل در فهرست هست ولی جور نمی‌شوداز بیلد دیگری است (همان نسخه، دوباره ساخته‌شده) — از همان جابی بارگذاری کنید که باینری منتشرشده را ساخته
فریم‌های NDK حل نمی‌شوندفایل‌های .so strip‌شده را بارگذاری کرده‌اید — نسخهٔ strip‌نشده را از فایل‌های میانی بیلد بفرستید
نگاشت ProGuard دستی هیچ‌وقت جور نمی‌شودشناسهٔ دیباگش همان UUIDی نیست که برنامه گزارش می‌کند
sentry-cli به sentry.io بارگذاری می‌کندSENTRY_URL / url تنظیم نشده
پاسخ 403 هنگام بارگذاریصاحب توکن عضو آن سازمان نیست