كيف أكتب سجلات الأخطاء x86 من مساحة المستخدم على OSX؟
-
25-09-2019 - |
سؤال
أرغب في اللعب مع Debug MSRs المحددة في SPEC X86 (DR0-7) من برنامج مساحة المستخدم OSX الخاص بي. لسوء الحظ ، هذه تتطلب cpl == 0 (ويعرف أيضًا باسم الحلقة 0). لقد قمت بإبهام Syscalls OSX وباستثناء kernel_debug
لا شيء يقفز حقًا كوسيلة للوصول إلى هذه.
قد يكون الأمر متاحًا فقط عبر واجهة المستوى الأعلى مثل kernel_debug
, ، لكن من غير الواضح بالنسبة لي إذا كان هذا هو الحال أو إذا لم أجد الاحتجاج السحري للوصول إليهم.
هدفي النهائي هو الوصول إلى وظائف هذه السجلات ، وليس السجلات نفسها. هل لدى أي شخص نظرة ثاقبة حول كيفية القيام بأشياء مثل تعيين نقاط توقف الأجهزة؟
المحلول
اتضح thread_get_state
/thread_set_state
هو الجواب الصحيح.
#include <mach/mach_types.h>
thread_t target = get_target_thread();
struct x86_debug_state dr;
mach_msg_type_number_t dr_count = x86_DEBUG_STATE_COUNT;
kern_return_t rc = thread_get_state(target, x86_DEBUG_STATE, &dr, &dr_count);
printf("DR0: 0x%08x\n", dr.uds.ds32.__dr0);
printf("DR1: 0x%08x\n", dr.uds.ds32.__dr1);
printf("DR2: 0x%08x\n", dr.uds.ds32.__dr2);
printf("DR3: 0x%08x\n", dr.uds.ds32.__dr3);
printf("DR4: 0x%08x\n", dr.uds.ds32.__dr4);
printf("DR5: 0x%08x\n", dr.uds.ds32.__dr5);
printf("DR6: 0x%08x\n", dr.uds.ds32.__dr6);
printf("DR7: 0x%08x\n", dr.uds.ds32.__dr7);
نصائح أخرى
هذا إلى حد كبير نقطة تعليمات الحلقة 0. لا يمكن الوصول إليها من مساحة المستخدمين.
لا تنتمي إلى StackOverflow