> On Oct. 14, 2014, 9:06 p.m., Timothy St. Clair wrote:
> > configure.ac, line 281
> > <https://reviews.apache.org/r/26426/diff/1/?file=714874#file714874line281>
> >
> > Is there a reason you want to leave debug symbols out of optimized
> > builds?
> >
> > cmake has the pattern correct imho:
> > Release
> > Debug
> > ReleaseWithDebug
> >
> > A ReleaseWithDebug allows packagers, such as myself, to build
> > w/debugsymbols that are stripped out into a .debuginfo package which can be
> > used by developers for tracing "When bears attack". Granted that it is
> > tenuous debugging at best, but it's better then nothing.
> >
> > So I think we want all three modes, stripping all debug information is
> > not really idea.
>
> Cody Maloney wrote:
> My main motivation is to shrink the size of libmesos. Yesterday sugis in
> #mesos had one which was 213M. For the buildbot internally, full debian
> packages (which are compressed) of mesos weign in at 165M a piece (Yes,
> stripping post-build would help a lot, but why build it to begin with?). Most
> of this is debug info. Also, we build a bunch of different ways, and when
> libmesos is as big as it is, a decent amount of time ends up being spent on
> disk I/O reading / writing all the debug info when we are really just trying
> to ensure it builds on all the different platforms (Not to mention storage
> and file size shipping things around the network to centralized repositories).
>
> The simple toggle between debug and release, removing the legacy logic
> gets us most of the benefit.
>
> If you have a good place to point me for what is needed to get a
> 'ReleaseWithDebug' info build up and running I can definitely work on adding
> that as well.
>
> Cody Maloney wrote:
> It is also entirely possible to specify custom CXXFLAGS + CFLAGS with
> this patch to get the old "optimized debug" build. The flags set by
> --enable-debug (or not having it), to get back the "optimized debug" build
> from before.
>
> Timothy St. Clair wrote:
> I suppose rpm builds default CXXFLAGS to '-O2 -g ...', so I can buy the
> argument of just making it easier on the average person.
>
> Ben Mahler wrote:
> Re-opening because conflating debug and optimization under a single flag
> seems a bit confusing to me.
>
> In practice, we run mesos **with optimizations** (for free performance
> win), and **with debugging symbols** (for meaningful backtraces and core
> dumps), which was previously the default but now requires the setting of
> CXXFLAGS to obtain. :(
>
> For development, I think by default we need debugging symbols turned on.
> Otherwise most people will forget to configure with `--enable-debug` and
> consequently will need to recompile everything when they encounter a
> backtrace or need to debug. CI jobs will encounter this issue as well.
>
> If there are use cases that merit no debugging symbols, seems nice to
> make that explicit given it runs the risk of making debugging difficult.
>
> Thoughts?
>
> Cody Maloney wrote:
> Note that the two were conflated under one flag previously. This just
> changes how we do it to be a little more standard way of conflating them.
> Generally people talk about `Debug` or `Relase` builds. Not the specific
> compiler flags that get switched. The general switch is -O2 -> -O0 + -g and
> back (Possibly with a couple extra warning flags). Autotools projects which
> implement a debug vs. release build almost always do '--enable-debug' / the
> default is 'optimized' build.
>
> https://gcc.gnu.org/wiki/DebugFission - that artical has some good
> explanations why debug info gets problematic as programs get larger and
> larger, which is only going to get worse over time. Already mesos debug info
> is over 100MB. As the codebase grows, this will get worse than it already is,
> increasing the minimum machine specs you need to develop / compile Mesos.
>
> Compiler implementors generally give that '-O2' should be used to
> generate an optimal binary. '-g' should be used when you are planning to
> attach GDB and step through a program line by line. General development
> generally people want nice backtraces, which is inbetween those. See
> **Backtraces**. The section **Coredumps** talks about how we can give all the
> info in coredumps without running full debug builds ('-g') everywhere.
>
> **Backtraces** should generally be reasonably meaningful as long as you
> don't strip the binary. Most of the symbols are still there (You just lose
> inlined things). You don't get file names and line numbers, but all the
> functions in mesos should be uniquely named (C++'s ODR rule), so you get out
> a mangled C++ name which you can demangle with `c++filt` (Shipped with GCC)
> and you will get the full namespace prefixed name of the C++ function. Find
> the function with your favorite text editor search, life is happy.
>
> Pretty much every binary which is shipped on your machine via a
> distribution is sent like this. The backtraces + coredumps that are gathered
> come from this.
>
> [Clang has a option
> -gline-tables-only](http://clang.llvm.org/docs/UsersManual.html#cmdoption-gline-tables-only)
> which adds just the file name and line numbers to all functions in the debug
> info (Which can be done with minimal space overhead. [Gcc has
> '-g1'](https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options),
> which would mean that you would get line number + file names in back traces
> with less overhead.
>
> Those options would make it so what people see printed by the build bot
> is exactly what they see now. I think that should be an easily accessible
> level, but not default build.
>
>
> **Coredumps**: It is possible to make coredumps just as inspectable
> without including debug information in all the shipping binaries. In fact,
> you generally probably don't want to run gdb on the binary on the production
> host anyways. For this, what typically happens is that
>
> 1. People actually only look at the backtrace to figure out what went
> wrong
> 2. You can generate debug information which lives in seperate files from
> the target executable (-gsplit-dwarf on new versions of GCC, requires a
> relatively new toolchain. I believe there is a way to do it on older tooling
> where you split it out later, but am not familiar with it). This debug info
> would generally live in a '-dbg' package. Which you can install / run on your
> local machine to inspect whatever variables remain directly, as well as
> global state.
>
>
> **OVERALL**
> I don't see anywhere where this makes debugging considerably more
> difficult than it is already. Yes, you can't attach a GDB to any build of
> mesos without thinking about it. I think most of the time most developers
> aren't attaching GDB.
>
> CI jobs I think can be easily switched over where they care. There aren't
> that many of them around. I agree it is something people need to be aware of,
> but not a hard level of change. Most CI systems don't let people connect in
> and step through the program with GDB to where it failed a test. It just
> gives a backtrace. In the case of a buildbot it isn't hard to set CXXFLAGS to
> just the level you want to get that ('-g1'). No major loss there with this
> change.
>
> The only case this makes considerably more difficult is that if you want
> to attach GDB to inspect variabels you need to have specified --enable-debug
> at configure time. I don't think that is a major loss, or something which is
> in the standard compile/test loop of most most Mesos contributors /
> developers (Although we can collect evidence if desired)
Thanks for being thorough! Having `-g1` and `-gline-tables-only` sound good to
me for release builds, any reason not to include those?
As for local development, I would _personally_ be fine with optimization turned
off and `-g1` and `-gline-tables-only`, if the smaller debug information has a
measurable improvement on compile speed or memory consumption (let's measure!).
I tend to only need backtrace, or at most gdb thread backtraces from a dump.
These two use-cases seem to suggest leaving the existing `--disable-optimize`
and merely tweaking the debug flags to avoid dumping all debug information into
release builds.
How about for this change, we tackle the following:
Default is Release: -O2 -g1 (or -gline-tables-only)
--disable-optimize: -O0 -g1 (or -gline-tables-only)
In a subsequent patch, we can add an orthogonal debug flag for those who want
to the full set of debug information:
--enable-debug: turns on -g
Thoughts? It seems we can acheive Debug / Release builds even if we don't map
the distinction to a single binary configure flag.
- Ben
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/26426/#review56573
-----------------------------------------------------------
On Oct. 14, 2014, 11:07 p.m., Cody Maloney wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/26426/
> -----------------------------------------------------------
>
> (Updated Oct. 14, 2014, 11:07 p.m.)
>
>
> Review request for mesos, Benjamin Hindman and Timothy St. Clair.
>
>
> Repository: mesos-git
>
>
> Description
> -------
>
> Reworks building mesos in "debug" vs. "release". By default, mesos is now
> built in release (no debug info, optimized build). If '--enable-debug' is
> specified to configure, than optimization will be turned off, and debug info
> will be turned on.
>
> This also adds a variable 'DEBUG' to the build environment, which people can
> use in code to see if mesos is built with debugging to enable extra
> assertions / checks. For release builds we may want to set 'NDEBUG' which
> removes assert()'s, but that is a seperate discussion.
>
> Main benefits:
> 1) Getting a build to include/exclude debug information at will is feasible.
> Before some things like using clang would forcibly enable debug info in all
> cases
> 2) libmesos.so and the other binaries which get packaged up for use in
> distributions shrink considerably without manually stripping post-build
> (Improves build time, makes packaging cleaner)
>
>
> Diffs
> -----
>
> configure.ac 2b372e06006250b5230956ef096473e98f3fa590
>
> Diff: https://reviews.apache.org/r/26426/diff/
>
>
> Testing
> -------
>
> Built with both --enable-debug and without, checking that the flags get
> passed through correctly.
>
>
> Thanks,
>
> Cody Maloney
>
>