2016-06-29 5 views
3

Работы на OSX с LLVM и lldb, у меня есть следующий код:C++ - Вызов неиспользованных функций из отладчика

#include <stdio.h> 
class A{ 
public: 
    void f() __attribute__((noinline)) 
    { 
     printf("f()\n"); 
    } 

    void g() __attribute__((noinline)) 
    { 
     printf("g()\n"); 
    } 

}; 

int main() 
{ 
    A a; 
    a.g(); 
    return 0; 
} 

При взломе основных(), и пытается вызвать p a.f() из отладчика я получаю:

error: Couldn't lookup symbols: __ZN1A1fEv

звонок p g.f(), однако хорошо работает.

Я понимаю, что f() можно оптимизировать, но есть ли способ отключить эту оптимизацию, поэтому я могу использовать ее в отладчике в любом случае?

Спасибо!

+0

Попробуйте добавить символ где-нибудь, например, 'f;' (а не 'f();') в 'main()'. – lorro

+0

Проверьте параметры оптимизации командной строки компилятора или параметры компилятора IDE. Практически все существующие компиляторы позволяют отключить оптимизацию. – Ari0nhh

+1

Как быстрый хак, вы можете попробовать сделать метод 'virtual'. – pts

ответ

1

Переместить определение f вне класса:

#include <stdio.h> 
class A { 
public: 
    void f(); 
    void g() __attribute__((noinline)) 
    { 
     printf("g()\n"); 
    } 
}; 
void A::f() 
{ 
    printf("f()\n"); 
} 
int main() 
{ 
    A a; 
    a.g(); 
    return 0; 
} 

Это работает для меня с $ g++ t.cc и $ g++ -g t.cc на Linux с GCC 4.8.4. Он также может работать с вашей инструментальной цепочкой.

$ g++ t.cc 
$ nm a.out | grep _ZN1A 
000000000040052e T _ZN1A1fEv 
0000000000400562 W _ZN1A1gEv 

В качестве альтернативы, как описано в ответ echristo, добавьте used к атрибутам f, и держать его в классе. Это также работает с $ г ++ t.cc and $ г ++ -g t.cc`:

$ g++ -g t.cc 
0000000000400548 W _ZN1A1fEv 
0000000000400560 W _ZN1A1gEv 

Добавление used также работает с g++ -O2 -g t.cc.

2

Хотя перемещение определения из строки может помочь в некоторых случаях, это не поможет во всех случаях, например. если это не функция-член odr C++, а скорее статическая функция или вся ваша программа оптимизирована по LTO, и функция не ссылается за пределы локальной единицы перевода.

В этих случаях (и, вероятно, это тоже), вы должны отметить функцию как __attribute__((used)), чтобы сообщить компилятору, что эта функция используется, и убедиться в этом и создать код для него в результирующем объектном файле, что также означает эта отладочная информация также будет сгенерирована.

Ваш окончательный код это будет в конечном итоге выглядит как:

#include <stdio.h> 

class A { 
public: 
    void f() __attribute__((noinline, used)) 
    { 
    printf("f()\n"); 
    } 

    void g() __attribute__((noinline)) 
    { 
    printf("g()\n"); 
    } 

}; 

int main() 
{ 
    A a; 
    a.g(); 
    return 0; 
} 

Это одна из причин, почему __attribute__((used)) был разработан. Из gcc documentation:

This attribute, attached to a function, means that code must be emitted for the function even if it appears that the function is not referenced. This is useful, for example, when the function is referenced only in inline assembly. When applied to a member function of a C++ class template, the attribute also means that the function is instantiated if the class itself is instantiated.

Это означает, что функция будет гарантированно выделяться во всех случаях, даже если оно не используется.

(В качестве дополнительного дополнения я еще не подтвердил, что это действительно будет работать для оптимизации LTO - возможно, это должно быть, но я уверен, что это угловой случай, о котором нередко думают, я не сделал этого, пока теперь и я работаю над LTO :)

+0

Отлично, я расширил свой ответ с помощью этой опции. – pts

+0

Я бы не стал использовать определения из строки, чтобы попытаться решить эту проблему. Он будет иметь дополнительные эффекты более широкого диапазона для программы и все еще может быть нарушен LTO или любым другим способом оптимизации кросс-модуля. Этот прецедент является одной из причин, почему __ атрибут __ ((используется)) был создан. Я еще раз уточню свой ответ, чтобы объяснить. – echristo

 Смежные вопросы

  • Нет связанных вопросов^_^