Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
$ cat 1.c
#include <stdio.h>
static foo() {
char *a = 0;
*a = 1;
}
int main() {
foo();
}
$ gcc 1.c -O0
1.c:3:8: warning: return type defaults to ‘int’ [-Wimplicit-int]
3 | static foo() {
| ^~~
$ ulimit -c unlimited
$ ./a.out
Segmentation fault (core dumped)
$ gdb a.out core
GNU gdb (Debian 13.1-3) 13.1
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...
(No debugging symbols found in a.out)
[New LWP 100]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000055a7adf14139 in foo ()
(gdb) bt
#0 0x000055a7adf14139 in foo ()
#1 0x000055a7adf1414d in main ()
На мой взгляд лучше явно указывать -g при компиляции, потому что иначе можно нарваться на то, что в каком-нибудь окружении по умолчанию дебажные символы не создаются.
If you are not using some other optimization option, consider using -Og (see Options That Control Optimization) with -g. With no -O option at all, some compiler passes that collect information useful for debugging do not run at all, so that -Og may result in a better debugging experience.
Да, в мире gcc (и, вероятно, LLVM) принято по умолчанию включать символы, а если они потом не нужны, стрипать их утилитой strip.
Почему на одних платформах pdb, на други всё сшито, не знаю. Вероятно, потому что в Винде большинство ПО (по крайней мере, раньше так было) — коммерческое, так что отправлять юзеру отладочные символы нежелательно. Когда они в отдельном pdb-файле, их распространением проще управлять.
Gcc же в основном используется для свободного ПО, поэтому всё для отладки из коробки.
Они сами как-то качаются, кстати. Там надо поставить переменную окружения, и dbghlp.dll сам их скачает. А у dbghlp (или как-то так) фронтом работают уже и windbg и соснольный (забыл как зовут) и VS и бывшеядерный и вся хуйня
Да, они весят больше.
А еще раньше была тн "checked' версия винды: винда собранная с ключами дебага. ее выдавали только доверенным партнёрам, чтобы им было удобнее отлаживать свое говно
Причём формат каталога менялся. Раньше был плоский список, а потом к именам файлов стали добавлять контрольные суммы, чтобы можно было одновременно держать символы от нескольких версий dll (сайд бай сайд).
откуда это видно?
Что ты дебажишь? Как ты собрал то, что ты дебажишь? С какими ключами? Как запущен gdb?
If you are not using some other optimization option, consider using -Og (see Options That Control Optimization) with -g. With no -O option at all, some compiler passes that collect information useful for debugging do not run at all, so that -Og may result in a better debugging experience.
Итого: -g -Og
я сделал -O0 чтобы мне мастер UB не заменил весь код на `return`, но твой вариант лучше
Почему в прыще принято вкомпаливать дебажные символы в бинарь, а в сперме делать отдельные pdb?
Почему на одних платформах pdb, на други всё сшито, не знаю. Вероятно, потому что в Винде большинство ПО (по крайней мере, раньше так было) — коммерческое, так что отправлять юзеру отладочные символы нежелательно. Когда они в отдельном pdb-файле, их распространением проще управлять.
Gcc же в основном используется для свободного ПО, поэтому всё для отладки из коробки.
Да, они весят больше.
А еще раньше была тн "checked' версия винды: винда собранная с ключами дебага. ее выдавали только доверенным партнёрам, чтобы им было удобнее отлаживать свое говно
Про checked откуда-то знаю. Из Windows DDK?
https://x.com/666_mancer/status/1803769377424019676
https://x.com/DNusina/status/1803017185809281119