الحصول على مكدس الاستدعاءات في الرمز مع أقل الحمل؟

StackOverflow https://stackoverflow.com/questions/1231671

  •  22-07-2019
  •  | 
  •  

سؤال

وانا ذاهب لتنفيذ التعريف الداخلي للذاكرة على لينكس. أريد أن حفظ كومة لكل malloc / الحرة / realloc. واني اسعى الى استخدام "pstack" للحصول على كل مرة تتبع مكدس. ولكن فوق مرتفع جدا. هل هناك أي نهج lightweigt للحصول على مكدس الاستدعاءات في التعليمات البرمجية C؟

وأعرف أن هناك بعض الأدوات مثل "valgrind، التعريف جوجل"، ولكن لا أعرف كيف remebmer مداخن لكل عمل.

وهو محل تقدير أي تعليق.

وشكرا.

هل كانت مفيدة؟

المحلول

ويمكنك جعل وظيفة الخاصة بك للحصول على المتصل:

static inline void *get_caller(void) {
    unsigned long *ebp;

    /* WARNING: This is working only with frame pointers */
    asm ("movl %%ebp, %0" : "=r" (ebp) : );
    ebp = (unsigned long*)*ebp;
    ebp = (unsigned long*)*(ebp+1);
    return ebp;
}

void *malloc(void) {
    void *caller = get_caller();
    ...    
}

و"ebp = (unsigned long*)*ebp;" سوف تجعلك تذهب من خلال كومة (إذا كنت بحاجة إلى أكثر من ذلك تتبع المكدس).

نصائح أخرى

وهناك وظيفة backtrace() GNU وهو سريع نسبيا - انها مجرد يعود مجموعة من عناوين

لحل هذه العناوين على العمل الأسماء التي تحتاج إلى استخدام backtrace_symbols() الذي هو أثقل بكثير ولكن نأمل أن لا تحتاج لتشغيل كثير من الأحيان.

لتحصل backtrace_symbols() في الواقع حل الأسماء التي تحتاج إلى استخدام خيارات رابط -rdynamic.

وانظر man backtrace لمزيد من التفاصيل.

واحترس من recursions مع backtrace_symbols ()، الذي يدعو malloc نفسها.

لاحظ أيضا أنه في أول استخدام للالمتتبع الخلفي () والأصدقاء ورابط ديناميكي محاولة لتحميل libgcc، والتي سوف مرة أخرى استدعاء malloc.

وجلعاد

والآن أقابل مشكلة على 64BIT.

في 64BIT، لا يتم الاحتفاظ RBP بدقة. على سبيل المثال، سوف -O3 دول مجلس التعاون الخليجي استخدام RBP كما حفظ المتصل العادي السجل. حتى في هذه الحالة، للحصول على دعوة أكوام من مؤشرات الإطار لا تعمل: (

وأي تعليقات؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top