قاعدة بيانات البرنامج

قاعدة بيانات البرنامج ( PDB ) هي صيغة ملفات (طورتها مايكروسوفت ) لتخزين معلومات تصحيح الأخطاء الخاصة ببرنامج (أو، عادةً، وحدات البرنامج مثل DLL أو EXE ). تحمل ملفات PDB عادةً الامتداد .pdb . يُنشأ ملف PDB عادةً من ملفات المصدر أثناء عملية الترجمة. يخزن هذا الملف قائمة بجميع الرموز في الوحدة مع عناوينها، وربما اسم الملف والسطر الذي تم فيه تعريف الرمز. لا تُخزن معلومات الرموز هذه في الوحدة نفسها، لأنها تشغل مساحة كبيرة.

التطبيقات

عند تصحيح برنامج ما، يقوم مصحح الأخطاء بتحميل معلومات التصحيح من ملف PDB ويستخدمها لتحديد مواقع الرموز أو ربط حالة التنفيذ الحالية لشفرة مصدر البرنامج . يستخدم Microsoft Visual Studio ملفات PDB كصيغة الملف الأساسية لمعلومات التصحيح.

يُستخدم ملف PDB أيضًا في الخدمات التي تجمع بيانات الأعطال من المستخدمين وتربطها بالأجزاء المحددة من التعليمات البرمجية المصدرية التي تسبب (أو تشارك في) العطل.

ستقوم مُجمِّعات مايكروسوفت، وفقًا للخيارات المناسبة، بتخزين معلومات حول أنواع البيانات الموجودة في المصادر المُجمَّعة في ملف PDB واحد. تُخزَّن معلومات تصحيح الأخطاء الخاصة بكل مصدر في ملف الكائن المُجمَّع ، وتحتوي على مراجع لأنواع البيانات في ملف PDB. ستضيف كل عملية تجميع إلى ملف PDB أي أنواع بيانات غير موجودة فيه مسبقًا، بحيث تظل المراجع في ملفات الكائنات المُجمَّعة صالحة.

يقوم رابط مايكروسوفت، عند اختيار الخيارات المناسبة، بإنشاء ملف PDB جديد كامل يجمع معلومات التصحيح الموجودة في وحدات الإدخال، والأنواع التي تشير إليها تلك الوحدات، ومعلومات أخرى يُنشئها الرابط. في حال إجراء الربط بشكل تدريجي، يتم تعديل ملف PDB الحالي بإضافة أو استبدال المعلومات المتعلقة بالوحدات المضافة أو المستبدلة فقط، وإضافة أي أنواع جديدة غير موجودة في ملف PDB.

تُزال ملفات PDB عادةً من حزمة توزيع البرامج. ويستخدمها المطورون أثناء تصحيح الأخطاء لتوفير الوقت واكتساب معلومات قيّمة.

استخلاص المعلومات

نشرت مايكروسوفت شفرة برمجية لقراءة وكتابة ملفات PDB (متعددة التدفقات) في مستودع "microsoft-pdb" عام 2015 بموجب ترخيص MIT . لا يمكن تجميع الشفرة في هذه الصيغة، لكنها تظل مرجعًا مفيدًا. يمكن استخراج المعلومات من ملف PDB باستخدام واجهات DIA (الوصول إلى واجهة التصحيح) المتوفرة في نظام التشغيل مايكروسوفت ويندوز . كما توجد أدوات خارجية أخرى، مثل radare2 و pdbparse ، قادرة على استخراج المعلومات من ملفات PDB .

تنسيق التدفق المتعدد

ملف PDB هو ملف واحد يتكون منطقيًا من عدة ملفات فرعية تُسمى " تدفقات" . صُمم هذا الملف لتحسين عملية إجراء التغييرات عليه، كما هو الحال في عمليات التجميع والربط التزايدي. يمكن حذف التدفقات أو إضافتها أو استبدالها دون إعادة كتابة أي تدفقات أخرى، كما يتم تقليل التغييرات في البيانات الوصفية التي تصف هذه التدفقات إلى الحد الأدنى.

يتم تنظيم قاعدة بيانات المنتج (PDB) في صفحات ذات حجم ثابت ، عادةً 1K أو 2K أو 4K، مرقمة بالتسلسل بدءًا من 0.

ملاحظة: يُفترض أن جميع المعلومات الرقمية (مثل أرقام التدفقات والصفحات) مُخزّنة بصيغة little-endian ، وهي الصيغة الأصلية لمعالجات Intel x86 . يعتمد كود pdbparse المكتوب بلغة Python على هذا الافتراض.

تدفق

يشغل كل تدفق في قاعدة بيانات PDB عدة صفحات، لا تكون بالضرورة مرقمة بالتسلسل. يُعرَّف التدفق برقم وله طول. محتوى التدفق هو عبارة عن تجميع صفحاته، مُقتطعة إلى طول التدفق.

تنسيق البيانات الوصفية

تتمثل وظيفة بيانات تعريف PDB في تحديد جميع تدفقات المكونات، مع توضيح طول كل تدفق وتسلسل صفحاته. تُرقّم التدفقات بالتسلسل بدءًا من 0. يوجد أيضًا تدفق رئيسي غير مرقم، يحتوي على بعض بيانات التعريف.

يبدأ ملف PDB برأسية تتكون من:

  • التوقيع، يُستخدم لتحديد الصيغة المحددة والتحقق من صحتها. يختلف طول التوقيع باختلاف الصيغة المحددة.
  • أما باقي رأس الصفحة فيختلف باختلاف التنسيق المحدد بواسطة التوقيع.

قد يكون رأس الصفحة أطول من صفحة واحدة.

تستخدم أدوات مايكروسوفت نوعين من تنسيقات ملفات PDB:

الإصدار 2

التوقيع هو "Microsoft C/C++ program database 2.00\r\n\032JG\0\0"(44 بايت).

يتكون الجزء المتبقي من العنوان مما يلي:

  • حجم الصفحة: 4 بايت.
  • صفحة البداية، 2 بايت.
  • عدد صفحات الملف، 2 بايت.
  • حجم دفق الجذر، 4 بايت.
  • محجوز، 4 بايت.
  • قائمة أرقام صفحات التدفق الجذري، بايتان لكل صفحة، تكفي لتغطية حجم التدفق الجذري المذكور أعلاه.

الإصدار 7

التوقيع هو "Microsoft C/C++ MSF 7.00\r\n\x1ADS\0\0\0"(32 بايت).

يتكون الجزء المتبقي من العنوان مما يلي:

  • حجم الصفحة: 4 بايت.
  • مؤشر جدول التخصيص، 4 بايتات. معنى هذا غير معروف. يبدو أن هناك جدول تخصيص، وهو عبارة عن مصفوفة من 65,536 بت (8,192 بايت)، موجود في نهاية ملف PDB، ويشير البت الواحد إلى صفحة غير مستخدمة.
  • عدد صفحات الملف، 4 بايت.
  • حجم دفق الجذر، 4 بايت.
  • محجوز، 4 بايت.
  • رقم الصفحة في قائمة أرقام صفحات دفق الجذر. لا يشير هذا الرقم إلى موقع دفق الجذر نفسه، بل إلى الصفحة التي تحتوي على البنية التي تشير إلى صفحاته. في تلك الصفحة، تشير قائمة أرقام صفحات دفق الجذر إلى الصفحات التي يُخزَّن فيها دفق الجذر. تحتوي كل صفحة على 4 بايتات، وهو ما يكفي لتغطية حجم دفق الجذر المذكور أعلاه.

جذر التيار

يصف التدفق الجذري جميع تدفقات PDB بدءًا من التدفق 0. وتختلف محتوياته باختلاف إصدار تنسيق PDB.

الإصدار 2

يتكون التيار الرئيسي من:

  • عدد التدفقات، 2 بايت.
  • محجوز، 2 بايت.
  • لكل قناة:
    • حجم التدفق: 4 بايت.
    • محجوز، 4 بايت.
  • لكل قناة:
    • قائمة أرقام صفحات البث، بايتان لكل صفحة، تكفي لتغطية حجم البث المذكور أعلاه.
الإصدار 7

يتكون التيار الرئيسي من:

  • عدد التدفقات، 4 بايت.
  • لكل قناة:
    • حجم التدفق: 4 بايت.
  • لكل قناة:
    • قائمة أرقام صفحات البث، 4 بايت لكل صفحة، تكفي لتغطية حجم البث المذكور أعلاه.

محتويات البث

تخزن أدوات مايكروسوفت أنواعًا مختلفة من المعلومات في مسارات مرقمة مختلفة. بعض أرقام المسارات مرتبطة بنوع معلومات ثابت، بينما يتم تحديد مسارات أخرى ضمن مسارات النوع الثابت المذكورة سابقًا.

يتم استخدام التدفق 1 للتحقق من أن ملف PDB هو نفس الملف المشار إليه في تدفق ملف تنفيذي أو ملف كائن.

  • الإصدار، 4 بايت.
  • طابع زمني وتاريخي، 4 بايتات.
  • العمر، 4 بايت. هذا هو عدد مرات تعديل ملف PDB هذا منذ إنشائه.
  • GUID، 16 بايت.
  • يبلغ الطول الإجمالي للأسماء التالية 4 بايتات. متبوعة بسلاسل أحرف منتهية بـ null.

 يحتوي كل  من التدفقين 2 و 4 على معلومات الأنواع. تُعرّف سجلات الأنواع الفعلية الأنواع المستخدمة في البرنامج. يمكن الاطلاع على بنية هذه السجلات في الملف cvinfo.h المُقدّم من مايكروسوفت. يوجد نوعان من السجلات، لكل منهما مجموعة أرقام فهرسة خاصة به: معرّفات الأنواع والأنواع؛ تُخزّن الأنواع فقط في التدفق 2، بينما تُخزّن معرّفات الأنواع فقط في التدفق  4. تُستخدم الفهارس للإشارة إلى هذه السجلات من داخل سجلات الرموز وسجلات الأنواع الأخرى.

  • عنوان الصفحة:
    • الإصدار، 4 بايت.
    • حجم رأس الملف: 4 بايت.
    • الحد الأدنى والحد الأقصى (الأخير + 1) للفهرس لسجلات النوع (4 بايت لكل منها).
    • حجم البيانات التالية، 4 بايت، حتى نهاية التدفق.
  • معلومات التجزئة:
    • رقم التدفق، بايتان مع بايتين إضافيين.
    • مفتاح التجزئة، 4 بايت.
    • الحاويات، 4 بايت.
    • HashVals و TiOff و HashAdj، كل منها يتكون من إزاحة وطول، كل منها 4 بايت.
  • حدد أنواع السجلات، طول متغير، العدد = (الحد الأقصى - الحد الأدنى) من العنوان أعلاه.

المسار  3 هو دليل للمسارات الأخرى. لاحظ أنه غير موجود في الإصدار 2، ولا في ملف PDB الناتج عن المُصرّف . يبدأ المسار برأسية مُضافة إليها حشوة ليصبح حجمها الإجمالي 64 بايت.

رأس تدفق PDB 3 (struct NewDBIHdr) [ 1 ]
إزاحةمقاساسموصف
04إمضاءمعرّف الرأس، == 0xFFFFFFFF
44إصدار رأس الصفحةنسخة من العنوان
84عمر
122snGSSyms
142usVerAll
اتحاد {struct {USHORT usVerPdbDllMin : 8 ; // الإصدار الثانوي وUSHORT usVerPdbDllMaj : 7 ; // الإصدار الرئيسي وUSHORT fNewVerFmt : 1 ; // علامة تُشير إلى أن لدينا ملف rbld مخزنًا في مكان آخر (البت الأعلى من رقم الإصدار الرئيسي الأصلي)} vernew ; // الذي أنشأ ملف pdb هذا آخر مرة.struct {USHORT usVerPdbDllRbld : 4 ;USHORT usVerPdbDllMin : 7 ;USHORT usVerPdbDllMaj : 5 ;} فيرولد ;USHORT usVerAll ;};
162snPSYms
182usVerPdbDllBuildإصدار البناء من ملف DLL الخاص بملف pdb الذي قام ببناء ملف pdb هذا آخر مرة
202snSymRecs
222VerPdbDllRBldإصدار rbld من ملف pdb dll الذي أنشأ ملف pdb هذا آخر مرة
244cbGpModiحجم دفق rgmodi الفرعي
284cbSCحجم تيار مساهمة القسم الفرعي
324خريطة cbSecMapحجم خريطة المقطع
364معلومات الملف cbحجم دفق معلومات الملف
404خريطة cbTSحجم دفق فرعي لخريطة خادم النوع
444iMFCمؤشر MFC
484cbDbgHdrحجم معلومات DbgHdr الاختيارية الملحقة بنهاية التدفق
524معلومات cbECعدد البايتات في دفق EC الفرعي، أو 0 إذا لم يتم تمكين أي تعديلات EC
562الأعلام
struct _flags {USHORT fIncLink : 1 ; // صحيح إذا تم الربط بشكل تدريجي (في الواقع فقط إذا كانت روابط ilink موجودة)USHORT fStripped : 1 ; // صحيح إذا قامت PDB::CopyTo بإزالة البيانات الخاصةUSHORT fCTypes : 1 ; // صحيح إذا كان ملف PDB هذا يستخدم CTypes.USHORT غير مستخدم : 13 ; // محجوز، يجب أن يكون 0.} flags ;
582جهازمعرّف الجهاز، وهو نفسه المستخدم في تنسيق كائن COFF، على سبيل المثال، 8664 سداسي عشري لمعالجات Intel x86 64 بت
604محجوزتوسيع مستقبلي، إضافة مساحة تخزين تصل إلى 64 بايت
  • معلومات الوحدة، طول متغير. الحجم الإجمالي مذكور في الترويسة أعلاه. يوجد عنصر واحد من هذه العناصر لكل وحدة كائن يستخدمها الرابط.
    • تم فتح الملف، 4 بايت.
    • معلومات الرمز.
      • رقم القسم، 2 بايت + 2 بايت حشو.
      • الإزاحة والحجم، 4 بايت لكل منهما.
      • الأعلام، 4 بايت.
      • رقم الوحدة، 2 بايت + 2 بايت حشو.
      • رموز التحقق من التكرار الدوري (CRC) لبيانات الأقسام وبيانات عمليات النقل، 4 بايت لكل منها.
    • الأعلام، 2 بايت.
    • رقم التدفق، 2 بايت.
    • حجم الرموز: 4 بايت.
    • أحجام معلومات أرقام الأسطر القديمة والجديدة، 4 بايت لكل منها.
    • عدد ملفات المصدر، 2 بايت + 2 بايت حشو.
    • الإزاحات، 4 بايت.
    • niSource و niCompiler، كل منهما بحجم 4 بايت.
    • اسم الوحدة، سلسلة بايتات منتهية بـ null.
    • اسم الكائن، سلسلة بايتات منتهية بـ null.
    • إضافة حشو إلى مضاعفات العدد 4 بايت.
  • مساهمات الأقسام، وعناوين الأقسام، ومعلومات الملفات، وخريطة ts، ومعلومات EC. ويمكن العثور على أحجامها في العنوان أعلاه.
  • رأس التصحيح،
    • أرقام التدفقات الخاصة بحذف مؤشر الإطار القديم، والاستثناءات، والتصحيحات، وخرائط الكائنات من وإلى المصدر، وعناوين الأقسام، ومعرفات حلقة الرمز المميز ، وXdata، وPdata، وحذف مؤشر الإطار الجديد، وأصل عنوان القسم. كل منها بحجم 2 بايت.

حجم الملف

يوفر تنسيق ملف PDB مرونة كبيرة للبرامج التي تكتب PDB بشكل تدريجي. على سبيل المثال، نظرًا لأن محتويات كل تدفق تُعامل كسلسلة من الصفحات المدرجة بطول محدد، يمكن للبرنامج الذي يكتب PDB استخدام عملية متعددة المراحل: أولًا، توسيع قائمة الصفحات إذا لزم الأمر، ثم إضافة البيانات (دون استبدالها)، وأخيرًا تغيير قيمة الطول لتطابقها كخطوة "تأكيد". في حال حدوث مشكلة أثناء الكتابة، يبقى التدفق دون تغيير. [ 2 ] ونتيجة لذلك، من المعروف أن PDB يُراكم مجموعة من السجلات غير المُشار إليها أو القديمة خلال فترة طويلة من الربط التدريجي. يُنصح بإعادة الربط بشكل صحيح عندما يكون حجم PDB كبيرًا. [ 3 ]

حتى مع وجود رابط سليم، فإن بنية صفحات ملف PDB تترك مساحة فارغة كبيرة فيه. يتضمن رابط مايكروسوفت /PDBCompressخيارًا يُخفف من هذه المشكلة عن طريق تفعيل ضغط NTFS الشفاف على الملف. [ 3 ]

لوحة توزيع كهربائية محمولة

يحتوي .NET على تنسيق "ملفات PDB المحمولة" منفصل مصمم خصيصًا لتلبية احتياجات التعليمات البرمجية المُدارة . وهو أبسط وأكثر إحكامًا، حيث استبدل [ 4 ] بنية التدفقات المتعددة بنظام البيانات الوصفية القياسي للبنية التحتية للغة المشتركة ، ECMA-335 القسم الثاني. [ 5 ]

انظر أيضاً

مراجع

  1. مايكروسوفت. "microsoft-pdb/PDB/dbi/dbi.h" . جيت هاب .
  2. "microsoft/microsoft-pdb" . مايكروسوفت. 15 يوليو 2026. يكتب مُنشئو ملفات PDB ما يشاؤون فيها، ولكن لن يتم حفظ التغييرات إلا بعد إصدار أمر حفظ صريح. يمنح هذا العملاء مرونة كبيرة - على سبيل المثال، يمكن للمُصرّف الاستمرار في كتابة المعلومات، وعدم حفظها، إذا صادف خطأً في شفرة المصدر الخاصة بالمستخدمين.
  3. 1 2 أستانا، أنكيت (5 مارس 2014). [devblogs.microsoft.com/cppblog/shrink-my-program-database-pdb-file/ "تقليص ملف قاعدة بيانات البرنامج (PDB)"]. مدونة فريق C++ .{{cite web}}: تحقق من |url=القيمة ( مساعدة )
  4. "designs/accepted/2020/diagnostics/portable-pdb.md at main · dotnet/designs" . GitHub .
  5. "Portable PDB v1.0: Format Specification (runtime/docs/design/specs/PortablePdb-Metadata.md at main · dotnet/runtime)" . GitHub .

للمزيد من القراءة