2012-06-11 17 views
11

Wystarczy podać jakiś kontekst, mówię o kompilowaniu kodu C++ z g ++ tutaj.g ++ - używa flagi "-g" do produkcji produkcji dobry pomysł?

Widzę, jak włączenie opcji -g dla kompilacji produkcyjnych byłoby wygodne z powodu konserwacji: program będzie o wiele łatwiej debugować, jeśli nieoczekiwanie się zawiesi.

Moje pytanie brzmi: czy włączenie flagi -g wpływa na plik wykonywalny w inny sposób niż zwiększenie jej rozmiaru? Czy w jakiś sposób może spowolnić kod (np. Wyłączając niektóre optymalizacje)?

Z tego co rozumiem, nie powinno (w dokumentacji tylko wzmianka o włączeniu symboli debugowania), ale nie jestem pewien.

Odpowiedz

13

Flaga -g nie wpływa na generowanie kodu, zmienia się tylko tablica symboli i metadane debugowania. Nie znajdują się one w sekcji kodu wykonywalnego, więc nie wpływają nawet na wydajność, gdy kod jest uruchamiany poza debem hte.

4

pamiętam czytanie że pewne optymalizacje są wyłączone z symboli debugowania: How Does The Debugging Option -g Change the Binary Executable?

Googling pokazuje również więcej stanowisk związanych z tym tematem.

Nie sądzę, że będzie to miało na ciebie wpływ, chyba że Twój kod jest bardzo wrażliwy na wydajność; i, poza tym, nie znam żadnych wad w górnej części mojej głowy (innych niż większe pliki binarne).

+2

Jak czytam te dokumenty, tylko kompilatory inne niż gcc mają optymalizacje zmienione przez -g. Moje doświadczenie jest takie, że w przypadku gcc idzie w innym kierunku: na to, co można zobaczyć i zrobić w debugerze, mają wpływ optymalizacje - czasami poważnie. Oczywiście tego można się spodziewać po agresywnej optymalizacji: nie można debugować tego, czego nie ma. – Gene

+0

@Gene: Oh widzę ... interesujące, dzięki za wskazanie. Wygląda więc na to, że byłem tym, który mylił się co do GCC! – Mehrdad

0

Moje pytanie brzmi, czy włączenie flagi -g wpływa na plik wykonywalny w inny sposób niż zwiększenie jego rozmiaru?

Nie, to całkiem możliwe, aby produkować zoptymalizowane pliki binarne z debugowania informacji, która nie wpływa na normalne kod w jakikolwiek sposób (mimo że informacje mogą być mniej przydatne, ponieważ zmienne nie muszą istnieć w czasach, funkcje inline są trudniejsze do debugowania itp.)

Dystrybucja Debiana buduje pakiety z informacjami o debugowaniu, które są później usuwane (czasami dzielone na "pakiet debugowania").

Należy jednak zauważyć, że wzrost rozmiaru może być dość duży.