رمزگشایی و نمادگذاری (Symbolication)

نحوه تبدیل آدرس‌های خام و نام‌های مبهم کامپایلر به توابع، نام فایل‌ها و خطوط خوانای کد منبع.

گزارش‌های کرش ارسالی از دستگاه‌های کاربران اغلب بلافاصله خوانا نیستند. به دلیل فشرده‌سازی و مبهم‌سازی کد توسط کامپایلرها (مانند R8 در اندروید یا حذف نمادها در کدهای باینری نیتیو)، فریم‌های استک ممکن است تنها شامل حروف تک‌حرفی یا آدرس‌های هگزادسیمال خام باشند.

فرآیند نمادگذاری: تبدیل آدرس خام به کد منبع خوانا
استک خام یا مبهم (Raw / Obfuscated)
at dev.didban.demo.a.b(SourceFile:1)#00 pc 0x0004a2c0 libnative_core.so0x0000000100003e40 MyApp + 15936
استک رمزگشایی‌شده (Retraced / Symbolicated)
at CheckoutViewModel.submitOrder(CheckoutViewModel.kt:184)process_packet() at native_core.c:42CartView.onCheckoutTapped() at CartView.swift:88

۱. استک‌های JVM در اندروید (R8 / ProGuard)

هنگام کامپایل نسخه انتشار در اندروید، ابزار R8 نام کلاس‌ها و متدها را به شناسه‌های کوتاه‌تر (مانند a.b.c) تغییر می‌دهد تا حجم فایل APK کاهش یابد. دیدبان با استفاده از فایل نگاشت mapping.txt تولیدشده در مرحله ساخت، این فریم‌ها را در زمان مشاهده در داشبورد بازسازی (Retrace) می‌کند:

Raw: at dev.didban.demo.a.b(SourceFile:1)
Retraced: at CheckoutViewModel.submitOrder(CheckoutViewModel.kt:184)

۲. کدهای نیتیو اندروید (Android NDK & GNU Build ID)

در کدهای نیتیو C/C++، سیگنال‌های مهلک تنها یک آدرس ثبات (Program Counter) و نام ماژول حاوی باینری را ثبت می‌کنند. دیدبان با تطبیق شناسه منحصر‌به‌فرد GNU Build ID کتابخانه‌های اشتراکی (.so) با نمادهای unstripped آپلودشده، آدرس را به نام تابع نیتیو و شماره خط تبدیل می‌کند:

Raw: #00 pc 0x0004a2c0 libnative_core.so
Symbolicated: process_packet() at native_core.c:42

۳. نمادگذاری در iOS با فایل‌های dSYM

در سیستم‌عامل iOS، فایل باینری نهایی فاقد اطلاعات دیباگ است و این اطلاعات در پکیج‌های dSYM ذخیره می‌شوند. دیدبان با استفاده از شناسه ساخت (Mach-O UUID)، آدرس‌های خام فریم‌های Swift و Objective-C را به کدهای اصلی پروژه ترجمه می‌نماید:

Raw: 0x0000000100003e40 MyApp + 15936
Symbolicated: CartView.onCheckoutTapped() at CartView.swift:88

بارگذاری فایل‌های dSYM در داشبورد

برای نمادگذاری خطاهای iOS، فایل dSYM نسخه منتشرشده را طبق مراحل زیر بارگذاری کنید:

  1. یافتن فایل dSYM در Xcode: در پنجره Organizer نرم‌افزار Xcode روی Archive راست‌کلیک کرده و گزینه Show in Finder را بزنید. سپس روی فایل .xcarchive راست‌کلیک کرده و Show Package Contents را انتخاب کنید تا پوشه dSYMs را ببینید.
  2. فشرده‌سازی در قالب ZIP: پوشه MyApp.app.dSYM را به فرمت zip فشرده کنید (مثلاً MyApp.app.dSYM.zip).
  3. بارگذاری در داشبورد دیدبان: وارد داشبورد شوید، پروژه iOS خود را انتخاب کنید، به بخش نسخه‌ها (Releases) بروید، نسخه مورد نظر را باز کرده و دکمه Upload dSYM را بزنید.

اهمیت تطابق دقیق شناسه ساخت (Build Identity)

هر بار که برنامه کامپایل می‌شود، حتی اگر فقط یک خط کد تغییر کرده باشد، آدرس‌های حافظه و نگاشت‌های R8 جابجا می‌شوند. بنابراین فایل مپینگ یا dSYM باید دقیقاً متعلق به همان کامپایل (Build) باشد. دیدبان با بررسی هش محتوا، شناسه نسخه و Build ID مانع از نمادگذاری اشتباه با فایل‌های ناسازگار می‌شود.