Gentoo Bug Reporting Guide
1. Introduction
Preface
One of the factors that delay a bug being fixed is the way it is reported. By
creating this guide, we hope to help improve the communication between
developers and users in bug resolution. Getting bugs fixed is an important, if
not crucial part of the quality assurance for any project and hopefully this
guide will help make that a success.
Bugs!!!!
You're emerge-ing a package or working with a program and suddenly the worst
happens -- you find a bug. Bugs come in many forms like emerge failures or
segmentation faults. Whatever the cause, the fact still remains that such a bug
must be fixed. Here is a few examples of such bugs.
Code Listing 1.1: A run time error |
$ ./bad_code `perl -e 'print Ax100'`
Segmentation fault
|
Code Listing 1.2: An emerge failure |
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/backward/backward_warning.h:32:2:
warning: #warning This file includes at least one deprecated or antiquated
header. Please consider using one of the 32 headers found in section 17.4.1.2 of
the C++ standard. Examples include substituting the <X> header for the <X.h>
header for C++ includes, or <sstream> instead of the deprecated header
<strstream.h>. To disable this warning use -Wno-deprecated.
In file included from main.cc:40:
menudef.h:55: error: brace-enclosed initializer used to initialize `
OXPopupMenu*'
menudef.h:62: error: brace-enclosed initializer used to initialize `
OXPopupMenu*'
menudef.h:70: error: brace-enclosed initializer used to initialize `
OXPopupMenu*'
menudef.h:78: error: brace-enclosed initializer used to initialize `
OXPopupMenu*'
main.cc: In member function `void OXMain::DoOpen()':
main.cc:323: warning: unused variable `FILE*fp'
main.cc: In member function `void OXMain::DoSave(char*)':
main.cc:337: warning: unused variable `FILE*fp'
make[1]: *** [main.o] Error 1
make[1]: Leaving directory
`/var/tmp/portage/xclass-0.7.4/work/xclass-0.7.4/example-app'
make: *** [shared] Error 2
!!! ERROR: x11-libs/xclass-0.7.4 failed.
!!! Function src_compile, Line 29, Exitcode 2
!!! 'emake shared' failed
|
These errors can be quite troublesome. However, once you find them, what do you
do? The following sections will look at two important tools for handling run
time errors. After that, we'll take a look at compile errors, and how to handle
them. Let's start out with the first tool for debugging run time errors --
gdb.
2. Debugging using GDB
Introduction
GDB, or the (G)NU (D)e(B)ugger, is a program used to find run time errors that
normally involve memory corruption. First off, let's take a look at what
debugging entails. One of the main things you must do in order to debug a
program is to emerge the program with FEATURES="nostrip". This
prevents the stripping of debug symbols. Why are programs stripped by default?
The reason is the same as that for having gzipped man pages -- saving space.
Here's how the size of a program varies with and without debug symbol stripping.
Code Listing 2.1: Filesize Comparison |
-rwxr-xr-x 1 chris users 3140 6/28 13:11 bad_code
-rwxr-xr-x 1 chris users 6374 6/28 13:10 bad_code
|
Just for reference, bad_code is the program we'll be debugging with
gdb later on. As you can see, the program without debugging symbols is
3140 bytes, while the program with them is 6374 bytes. That's close to double
the size! Two more things can be done for debugging. The first is adding ggdb3
to your CFLAGS and CXXFLAGS. This flag adds more debugging information than is
generally included. We'll see what that means later on. This is how
/etc/make.conf might look with the newly added flags.
Code Listing 2.2: make.conf settings |
CFLAGS="-O1 -pipe -g -ggdb"
CXXFLAGS="${CFLAGS}"
|
Lastly, you can also add debug to the package's USE flags. This can be done
with the package.use file.
Code Listing 2.3: Using package.use to add debug USE flag |
# echo "category/package debug" >> /etc/portage/package.use
|
Note:
The directory /etc/portage does not exist by default and you may
have to create it, if you have not already done so. If the package already has
USE flags set in package.use, you will need to manually modify them
in your favorite editor.
|
Then we re-emerge the package with the modifications we've done so far as shown
below.
Code Listing 2.4: Re-emergeing a package with debugging |
# FEATURES="nostrip" emerge package
|
Now that debug symbols are setup, we can continue with debugging the program.
Running the program with GDB
Let's say we have a program here called "bad_code". Some person claims that the
program crashes and provides an example. You go ahead and test it out:
Code Listing 2.5: Breaking The Program |
$ ./bad_code `perl -e 'print Ax100'`
Segmentation fault
|
It seems this person was right. Since the program is obviously broken, we have
a bug at hand. Now, it's time to use gdb to help solve this matter. First
we run gdb with --args, then give it the full program with
arguments like shown:
Code Listing 2.6: Running Our Program Through GDB |
$ gdb --args ./bad_code `perl -e 'print Ax100'`
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".
|
Note:
One can also debug with core dumps. These core files contain the same
information that the program would produce when run with gdb. In order to debug
with a core file with bad_code, you would run gdb ./bad_code core where
core is the name of the core file.
|
You should see a prompt that says "(gdb)" and waits for input. First, we have to
run the program. We type in run at the command and receive a notice like:
Code Listing 2.7: Running the program in GDB |
(gdb) run
Starting program: /home/chris/bad_code
Program received signal SIGSEGV, Segmentation fault.
0xb7ec6dc0 in strcpy () from /lib/libc.so.6
|
Here we see the program starting, as well as a notification of SIGSEGV, or
Segmentation Fault. This is GDB telling us that our program has crashed. It
also gives the last run function it could trace when the program crashes.
However, this isn't too useful, as there could be multiple strcpy's in the
program, making it hard for developers to find which one is causing the issue.
In order to help them out, we do what's called a backtrace. A backtrace runs
backwards through all the functions that occurred upon program execution, to the
function at fault. Functions that return (without causing a crash) will not show
up on the backtrace. To get a backtrace, at the (gdb) prompt, type in bt.
You will get something like this:
Code Listing 2.8: Program backtrace |
(gdb) bt
#0 0xb7ec6dc0 in strcpy () from /lib/libc.so.6
#1 0x0804838c in run_it ()
#2 0x080483ba in main ()
|
You can notice the trace pattern clearly. main() is called first, followed by
run_it(), and somewhere in run_it() lies the strcpy() at fault. Things such as
this help developers narrow down problems. There are a few exceptions to the
output. First off is forgetting to enable debug symbols with
FEATURES="nostrip". With debug symbols stripped, the output looks something
like this:
Code Listing 2.9: Program backtrace With debug symbols stripped |
(gdb) bt
#0 0xb7e2cdc0 in strcpy () from /lib/libc.so.6
#1 0x0804838c in ?? ()
#2 0xbfd19510 in ?? ()
#3 0x00000000 in ?? ()
#4 0x00000000 in ?? ()
#5 0xb7eef148 in libgcc_s_personality () from /lib/libc.so.6
#6 0x080482ed in ?? ()
#7 0x080495b0 in ?? ()
#8 0xbfd19528 in ?? ()
#9 0xb7dd73b8 in __guard_setup () from /lib/libc.so.6
#10 0xb7dd742d in __guard_setup () from /lib/libc.so.6
#11 0x00000006 in ?? ()
#12 0xbfd19548 in ?? ()
#13 0x080483ba in ?? ()
#14 0x00000000 in ?? ()
#15 0x00000000 in ?? ()
#16 0xb7deebcc in __new_exitfn () from /lib/libc.so.6
#17 0x00000000 in ?? ()
#18 0xbfd19560 in ?? ()
#19 0xb7ef017c in nullserv () from /lib/libc.so.6
#20 0xb7dd6f37 in __libc_start_main () from /lib/libc.so.6
#21 0x00000001 in ?? ()
#22 0xbfd195d4 in ?? ()
#23 0xbfd195dc in ?? ()
#24 0x08048201 in ?? ()
|
This backtrace contains a large number of ?? marks. This is because without
debug symbols, gdb doesn't know how the program was run. Hence, it is
crucial that debug symbols are not stripped. Now remember a while ago we
mentioned the -ggdb flag. Let's see what the output looks like with the flag
enabled:
Code Listing 2.10: Program backtrace with -ggdb3 |
(gdb) bt
#0 0xb7e4bdc0 in strcpy () from /lib/libc.so.6
#1 0x0804838c in run_it (input=0x0) at bad_code.c:7
#2 0x080483ba in main (argc=1, argv=0xbfd3a434) at bad_code.c:12
|
Here we see that a lot more information is available for developers. Not only is
function information displayed, but even the exact line numbers of the source
files. This method is the most preferred if you can spare the extra space.
Here's how much the file size varies between debug, strip, and -ggdb enabled
programs.
Code Listing 2.11: Filesize differences With -ggdb flag |
-rwxr-xr-x 1 chris users 3140 6/28 13:11 bad_code
-rwxr-xr-x 1 chris users 6374 6/28 13:10 bad_code
-rwxr-xr-x 1 chris users 19552 6/28 13:11 bad_code
|
As you can see, -ggdb adds about 13178 more bytes to the file size over the one
with debugging symbols. However, as shown above, this increase in file size can
be worth it if presenting debug information to developers. The backtrace can be
saved to a file by copying and pasting from the terminal (if it's a non-x based
terminal, you can use gpm. To keep this doc simple, I recommend you read up on
the documentation for gpm to see how to copy and paste with it). Now that we're
done with gdb, we can quit.
Code Listing 2.12: Quitting GDB |
(gdb) quit
The program is running. Exit anyway? (y or n) y
$
|
This ends the walk-through of gdb. Using gdb, we hope that you will
be able to use it to create better bug reports. However, there are other types
of errors that can cause a program to fail during run time. One of the other
ways is through improper file access. We can find those using a nifty little
tool called strace.
3. Finding file access errors using strace
Introduction
Programs often use files to fetch configuration information, access hardware or
write logs. Sometimes, a program attempts to reach such files incorrectly. A
tool called strace was created to help deal with this. strace
traces system calls (hence the name) which include calls that use the memory and
files. For our example, we're going to take a program foobar2. This is an
updated version of foobar. However, during the change over to foobar2, you notice
all your configurations are missing! In foobar version 1, you had it setup to
say "foo", but now it's using the default "bar".
Code Listing 3.1: Foobar2 With an invalid configuration |
$ ./foobar2
Configuration says: bar
|
Our previous configuration specifically had it set to foo, so let's use
strace to find out what's going on.
Using strace to track the issue
We make strace log the results of the system calls. To do this, we run
strace with the -o[file] arguments. Let's use it on foobar2 as shown.
Code Listing 3.2: Running foobar2 through strace |
# strace -ostrace.log ./foobar2
|
This creates a file called strace.log in the current directory. We
check the file, and shown below are the relevant parts from the file.
Code Listing 3.3: A Look At the strace Log |
open(".foobar2/config", O_RDONLY) = 3
read(3, "bar", 3) = 3
|
Aha! So There's the problem. Someone moved the configuration directory to
.foobar2 instead of .foobar. We also see the program
reading in "bar" as it should. In this case, we can recommend the ebuild
maintainer to put a warning about it. For now though, we can copy over the
config file from .foobar and modify it to produce the correct
results.
Conclusion
Now we've taken care of finding run time bugs. These bugs prove to be
problematic when you try and run your programs. However, run time errors are
the least of your concerns if your program won't compile at all. Let's take a
look at how to address emerge compile errors.
4. Handling emerge Errors
Introduction
emerge errors, such as the one displayed earlier, can be a major cause
of frustration for users. Reporting them is considered crucial for maintaining
the health of Gentoo. Let's take a look at a sample ebuild, foobar2, which
contains some build errors.
Evaluating emerge Errors
Let's take a look at this very simple emerge error:
Code Listing 4.1: emerge Error |
gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-7.o foobar2-7.c
gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-8.o foobar2-8.c
gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-9.o foobar2-9.c
gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2.o foobar2.c
foobar2.c:1:17: ogg.h: No such file or directory
make: *** [foobar2.o] Error 1
!!! ERROR: sys-apps/foobar2-1.0 failed.
!!! Function src_compile, Line 19, Exitcode 2
!!! Make failed!
!!! If you need support, post the topmost build error, NOT this status message
|
The program is compiling smoothly when it suddenly stops and presents an error message. This
particular error can be split into 3 different sections, The compile messages, the build
error, and the emerge error message as shown below.
Code Listing 4.2: Parts of the error |
gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-7.o foobar2-7.c
gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-8.o foobar2-8.c
gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-9.o foobar2-9.c
gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2.o foobar2.c
foobar2.c:1:17: ogg.h: No such file or directory
make: *** [foobar2.o] Error 1
!!! ERROR: sys-apps/foobar2-1.0 failed.
!!! Function src_compile, Line 19, Exitcode 2
!!! Make failed!
!!! If you need support, post the topmost build error, NOT this status message
|
The compilation messages are what lead up to the error. Most often, it's good to
at least include 10 lines of compile information so that the developer knows
where the compilation was at when the error occurred.
Make errors are the actual error and the information the developer needs. When
you see "make: ***", this is often where the error has occurred. Normally, you
can copy and paste 10 lines above it and the developer will be able to address
the issue. However, this may not always work and we'll take a look at an
alternative shortly.
The emerge error is what emerge throws out as an error. Sometimes, this
might also contain some important information. Often people make the mistake of
posting the emerge error and that's all. This is useless by itself, but with
make error and compile information, a developer can get what application and
what version of the package is failing. As a side note, make is commonly used as
the build process for programs (but not always). If you can't find a
"make: ***" error anywhere, then simply copy and paste 20 lines before the
emerge error. This should take care of most all build system error messages. Now
let's say the errors seem to be quite large. 10 lines won't be enough to catch
everything. That's where PORT_LOGDIR comes into play.
emerge and PORT_LOGDIR
PORT_LOGDIR is a portage variable that sets up a log directory for separate
emerge logs. Let's take a look and see what that entails. First, run your
emerge with PORT_LOGDIR set to your favorite log location. Let's say we have a
location /var/log/portage. We'll use that for our log directory:
Note:
In the default setup, /var/log/portage does not exist, and you will
most likely have to create it. If you do not, portage will fail to write the
logs.
|
Code Listing 4.3: emerge-ing With PORT_LOGDIR |
# PORT_LOGDIR=/var/log/portage emerge foobar2
|
Now the emerge fails again. However, this time we have a log we can work with,
and attach to the bug later on. Let's take a quick look at our log directory.
Code Listing 4.4: PORT_LOGDIR Contents |
# ls -la /var/log/portage
total 16
drwxrws--- 2 root root 4096 Jun 30 10:08 .
drwxr-xr-x 15 root root 4096 Jun 30 10:08 ..
-rw-r--r-- 1 root root 7390 Jun 30 10:09 2115-foobar2-1.0.log
|
The log files have the format [counter]-[package name]-[version].log. Counter
is a special variable that is meant to state this package as the n-th package
you've emerged. This prevents duplicate logs from appearing. A quick look at
the log file will show the entire emerge process. This can be attached later
on as we'll see in the bug reporting section. Now that we've safely obtained
our information needed to report the bug we can continue to do so. However,
before we get started on that, we need to make sure no one else has reported
the issue. Let's take a look at searching for bugs.
5. Searching Using Bugzilla
Introduction
Bugzilla is what we at Gentoo use to
handle bugs. Gentoo's Bugzilla is reachable by HTTPS and HTTP. HTTPS is
available for those on insecure networks or simply paranoid :). For the sake of
consistency, we will be using the HTTPS version in the examples to follow. Head
over to Gentoo Bugs to see how it
looks.
One of the most frustrating things for developers and bug-wranglers is finding
duplicate bug reports. These cost them valuable time that they could otherwise
use to work on more important bugs. Often, this can be prevented by a few simple
search methods. So we're going to see how to search for bugs and find out if
you have one that's similar. For this example, we're going to use the xclass
emerge error that was used earlier.
Code Listing 5.1: xclass emerge error |
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/backward/backward_warning.h:32:2:
warning: #warning This file includes at least one deprecated or antiquated
header. Please consider using one of the 32 headers found in section 17.4.1.2 of
the C++ standard. Examples include substituting the <X> header for the <X.h>
header for C++ includes, or <sstream> instead of the deprecated header
<strstream.h>. To disable this warning use -Wno-deprecated.
In file included from main.cc:40:
menudef.h:55: error: brace-enclosed initializer used to initialize `
OXPopupMenu*'
menudef.h:62: error: brace-enclosed initializer used to initialize `
OXPopupMenu*'
menudef.h:70: error: brace-enclosed initializer used to initialize `
OXPopupMenu*'
menudef.h:78: error: brace-enclosed initializer used to initialize `
OXPopupMenu*'
main.cc: In member function `void OXMain::DoOpen()':
main.cc:323: warning: unused variable `FILE*fp'
main.cc: In member function `void OXMain::DoSave(char*)':
main.cc:337: warning: unused variable `FILE*fp'
make[1]: *** [main.o] Error 1
make[1]: Leaving directory
`/var/tmp/portage/xclass-0.7.4/work/xclass-0.7.4/example-app'
make: *** [shared] Error 2
!!! ERROR: x11-libs/xclass-0.7.4 failed.
!!! Function src_compile, Line 29, Exitcode 2
!!! 'emake shared' failed
|
So to begin searching, we head over to the Bugzilla Homepage.
Figure 5.1: Bugzilla Homepage |
|
We'll click on "Query Existing bug reports". The reason why we choose this
over the basic bug search is because the basic bug search tends to give vague
results and often hinders users from looking through the results and finding the
duplicate bug. Once we click on the query screen, we reach the next page:
Figure 5.2: Bugzilla Search Page |
|
Note:
If you've used the Advanced Search before, you'll most likely see that screen
instead.
|
Proceed by clicking on the "Advanced Search" link to bring up the Advanced
Search page.
Figure 5.3: Advanced Search Page |
|
This is how the Advanced Search Page looks like. While it may seem overwhelming
at first, we're going to look at a few simple areas to narrow down the rather
vague searches bugzilla returns.
Figure 5.4: Content |
|
The first field is the summary of the bug. Here we're simply going to put the
name of the package that's crashing. If bugzie doesn't return results, try
removing the package name, just in case someone didn't put that in the summary
(highly unlikely, but we've seen a fair share of strange bug reports).
Product, Component, and Version should all be set to the default. This
prevents us from being too specific and missing all the bugs.
Comment is the important part. Use the comment field to list what appears to be a
specific instance of the error. Basically, don't use anything like the
beginning of the build error, find a line that's before it stating a true
error. Also, you'll want to filter out any punctuation to prevent bugzilla
from interpreting the results the comment the wrong way. Example from the xclass
emerge error:
Code Listing 5.2: Comment Line Content |
menudef.h:78: error: brace-enclosed initializer used to initialize `OXPopupMenu'
menudef.h 78 error brace-enclosed initializer used to initialize OXPopupMenu
|
The above is specific enough to where we'll find the bug without wading through
other xclass compile failure candidates.
URI, Whiteboard, and Keywords can all be left alone. What we've entered so far
should be enough to find our bug. Let's take a look at what we have filled out.
Figure 5.5: Completed Search Form |
|
Now we click on the Search button and here come the results...
Figure 5.6: Search Results |
|
Only 2 bugs! That's a lot easier to deal with. We click on the first one to
check, and sure enough it's the one we're looking for.
Figure 5.7: Bug Located |
|
Not only is it the one we want, but it has also been resolved. By checking the
last comment we see the solution and know what to do in order to resolve it.
Now, let's see what would have happened if we had not used the advanced search.
Figure 5.8: Basic Search Results |
|
4 more bugs to deal with! It gets even worse with larger packages. However,
with these simple tools, we're able to significantly narrow down the search to
try and locate a specific bug.
Conclusion
Let's say that you have searched and searched but still can't find a bug.
You've found yourself a new bug. Let's take a look at the bug reporting process
for submitting your new bug.
6. Reporting Bugs
Introduction
In this chapter, we'll figure out how to use Bugzilla to file a shiny, new bug.
Head over to Gentoo Bugs and...
Figure 6.1: Bugzilla Homepage |
|
Click on "Report a Bug - Using the guided format".
Figure 6.2: Product Selection |
|
As you can see, major emphasis has been placed on putting your bug in the
right place. Gentoo Linux is where a large majority of bugs go.
Despite this, some people will file ebuild bugs in portage development
(assumption that portage team handles the portage tree) or infra (assumption
that infra has access to mirrors and rsync and can fix it directly). This is
simply not how things work.
Another common misconception occurs with our Documentation bugs. For example, a
user finds a bug with the Catalyst
Docs. The general tendency is to file a bug under Docs-user, which gets
assigned to the GDP, when it should
actually go to a member of the Release
Engineering team. As a rule of thumb, only documentation under
http://www.gentoo.org/doc/* is under the GDP. Anything under
http://www.gentoo.org/proj/* is under the respective teams.
Note:
We would rather see a bug whose product was not supposed to be Gentoo Linux but
has been filed under the same rather than seeing a bug which belongs the Gentoo
Linux product and filed elsewhere. While neither is preferred, the former is more
acceptable and understandable (except website bugs.. we might have an issue with
that...).
|
Our bug goes in Gentoo Linux as it's an ebuild bug. We head over there and are
presented with the multi-step bug reporting process. Let us now proceed with
Step 1...
Figure 6.3: Guided Format Step 1 |
|
The first step here is really important (as the red text tells you). This is
where you search to see that someone else hasn't hit the same bug you have, yet.
If you do skip this step and a bug like yours already exists, it will be marked
as a DUPLICATE thus wasting a large amount of QA effort. To give you an idea,
the bug numbers that are struck out above are duplicate bugs. Now comes step 2,
where we give the information.
Required Information
Figure 6.4: Basic Information |
|
Let us take a closer look at what's what.
-
First, there's the Product. The product will narrow down the bug to a
specific area of Gentoo like Bugzilla (for bugs relating to
bugs.gentoo.org), Docs-user(for User Documentation) or Gentoo Linux (for
ebuilds and the like).
-
Component is where exactly the problem occurs, more specifically which part
of selected product the bug comes under. This makes classification easier.
-
Hardware platform is what architecture you're running. If you were running
SPARC, you would set it to SPARC.
-
Operating System is what Operating System you're using. Because Gentoo is
considered a "Meta-distribution", it can run on other operating systems
beside Linux.
So, for our example bug, we have :
- Product - Gentoo Linux (Since it is an ebuild issue)
- Component - Application (It is an application at fault, foobar2)
- Hardware Platform - All (This error could occur across architectures)
- Operation System - All (It could occur on all types of systems)
Figure 6.5: Completed Basic Information |
|
-
Build Identifier is basically the User Agent of the browser that is being
used to report the bugs (for logging purposes). You can just leave this as
is.
-
URL is optional and is used to point to errors on a site someplace
(pastebin, etc.). However, doing it inside the bug allows the developers be
able to reference to it at any time and is preferred.
-
In the Summary, you should put the package category, name, and number.
Not including the category in the summary really isn't too bad, but it's
recommended. If you don't include the package name, however, we won't know what
you're filling a bug for, and will have to ask you about it later. The version
number is important for people searching for bugs. If 20 people filed bugs and
not one put a version number, how would people looking for similar bugs be able
to tell if one was there's? They'd have to look through every single bug, which
isn't too hard, but if there are say, 200 bugs.. it's not that easy. After all
the package information, you'll want to include a small description of the
incident. Here's an example:
Figure 6.6: Summary |
|
These simple rules can make handling bugs a lot easier. Next are the details.
Here we put in the information about the bug. We'll demonstrate with an example:
Figure 6.7: Details |
|
Now the developer knows why we're filing the bug. They can then try to
reproduce it. Reproducibility tells us how often we were able to make the
problem recur. In this example, we can reproduce it any time simply by running
foobar2. Let's put that information in.
Figure 6.8: Reproduction |
|
We have explained how we found the bug. The next step is to explain what were
the results we got and what we think they should actually be.
Figure 6.9: Results |
|
We could then provide additional information. This could be things such as
stack traces, sections (since the whole log is usually big and of not
much use) of strace logs, but most importantly, your emerge --info
output. Here's an example.
Figure 6.10: Additional Information |
|
Lastly we select the severity of the bug. Please look this over carefully. In
most cases it's OK to leave it as is and someone will raise/lower it for you.
However, if you raise the severity of the bug, please make sure you read it over
carefully and make sure you're not making a mistake. A run down of the various
levels is given below.
-
Blocker - The program just plain doesn't want to emerge or is a major
hinderance to the system. For example a baselayout issue which
prevents a system from booting up would be a sure candidate to be labelled
blocker.
-
Critical - The program has loss of data or severe memory leaks during
runtime. Again, an important program like say net-tools failing to
compile could be labelled critical. It won't prevent the system from
starting up, but is quite essential for day to day stuff.
-
Major - The program crashes, but nothing that causes your system severe
damage or information loss.
-
Minor - Your program crashes here and there with apparent workarounds.
-
Normal - The default. If you're not sure leave it here unless it's a new
build or cosmetic change, then read below for more information.
- Trivial - Things such as a mispelled word or whitespace clean up.
-
Enhancement - A request to enable a new feature in a program, or more
specifically new ebuilds.
Figure 6.11: Severity |
|
Here, we'll set it to Normal.
Now we can submit the bug report by clicking on the Submit Bug Report box. You
will now see your new bug come up. See Bug 97561 for what
the result looks like. We've reported our bug! Now let's see how it's dealt
with.
7. Working With Your Bug
Looking at the bug, we see the information we provided earlier. You will notice
that the bug has been assigned to bug-wranglers@gentoo.org. This is the default
location for Application component bugs.
Figure 7.1: New Bug Basic Information |
|
The details we entered about the bug are available as well.
Figure 7.2: New Bug Details |
|
However, bug-wranglers (usually) won't fix our bugs, so we'll reassign it to
someone that can (you can let bug-wranglers re-assign it for you as well). For
this we use the package's metadata.xml. You can normally find them in
/usr/portage/category/package/metadata.xml. Here's one I've made up
for foobar2.
Note:
You have to be the reporter of the bug or a member of certain Gentoo Bugzilla
groups (like Gentoo Developers) to be able to reassign bugs.
|
Code Listing 7.1: metadata.xml |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<herd>chriswhite</herd>
<maintainer>
<email>chriswhite@gentoo.org</email>
<name>Chris White</name>
</maintainer>
<longdescription lang="en">
Foobar2 is a package that uses a configuration file to display a word.
</longdescription>
</pkgmetadata>
|
Notice the maintainer section. This lists the maintainer of the package, which
in this case is myself, Chris White. The email listed is chriswhite@gentoo.org.
We will use this to re-assign the bug to the proper person. To do this, click
the bubble next to Reassign bug to, then fill in the email.
Note:
A bug for a package without a metadata.xml file should be re-assigned to
maintainer-needed@gentoo.org and a package that needs a Gentoo Developer to
maintain should be assigned to maintainer-wanted@gentoo.org.
|
Figure 7.3: Bug Reassignment |
|
Then hit the Commit button for the changes to take place. The bug has been
reassigned to me. Shortly afterward, you notice (by email usually) that I've
responded to your bug. I've stated that I'd like to see an strace log to figure
out how the program is trying to reach your configuration file. You follow the
previous instructions on using strace and obtain an strace log. Now you need to
attach it to the bug. In order to do this, click on "Create A New Attachment".
Figure 7.4: New Attachment |
|
Now we have to attach the log. Let's go throught it step wise.
-
File - This is the location of the file in your machine. In this example,
the location of strace.log. You can use the "Browse..." button
to select the file, or enter the path directly in the text field.
-
Description - A short one liner, or a few wors describing the attachment.
We'll just enter strace.log here, since that's quite self-explanatory.
-
Content Type - This is the type of the file we're attaching to the bug.
-
Obsoletes - If there were attachements submitted to the bug before the
current one, you have an option of declaring them obsoleted by yours. Since
we have no prior attachments to this bug, we need not bother.
-
Comment - Enter comments that will be visible along with the attachments.
You could elaborate on the attachment here, if needed.
With respect to Content Type, here are a few more details. You can check the
"patch" checkbox if you're submitting a patch. Otherwise, you could ask
Bugzilla to "auto-detect" the file type (not advisable). The other options are
"select from list", which is most frequently used. Use plain text (text/plain)
for most attachments except binary files like images (which can use
image/gif, image/jpeg or image/png depending on type) or compressed files like
.tar.bz2 which would use application/octet-stream as content type.
Figure 7.5: New Attachment Completed |
|
We submit strace.log and it is reflected on the bug report.
Figure 7.6: Attached strace log |
|
We've mentioned before that sometimes ebuilds will tell you to attach a file in
the emerge error. An example can be seen below.
Code Listing 7.2: Example File Attachment Request |
configure: error: PNG support requires ZLIB. Use --with-zlib-dir=<DIR>
!!! Please attach the config.log to your bug report:
!!! /var/tmp/portage/php-5.0.3-r1/work/php-5.0.3/config.log
!!! ERROR: dev-php/php-5.0.3-r1 failed.
!!! Function econf, Line 485, Exitcode 0
!!! econf failed
!!! If you need support, post the topmost build error, NOT this status message.
|
Please attach any file mentioned like this to your bug report.
While we're doing all this, suppose another person finds your bug by searching
through bugzilla and is curious to keep track of the bug, they may do so by
putting their email in the Add CC field of the bug as shown below. You could
also keep track of other bugs by following the same method.
Figure 7.7: Adding Email To CC: |
|
Note:
Email addresses must be registered with Gentoo Bugzilla. In order to CC multiple
addresses, simply separate them with commas or spaces.
|
After all this work, the bug can undergo various status markings. This is
usually done by the Gentoo Developers and sometimes by the reporter. The
following are the various possible states a bug may go through during its
lifetime.
-
UNCONFIRMED - You're generally not going to see this too often. This means
that a bug reporter has opened a bug using the advanced method and is
uncertain his or her bug is an actual bug.
- NEW - Bugs that are first opened are considered new.
-
ASSIGNED - When the person you've assigned the bug too validates your bug,
it will often receive ASSIGNED status while they figure out the issue.
This lets you know that they've accepted your bug as a real bug.
-
REOPENED - Someone has resolved a bug and you think the solution is not
feasible or the problem still persists. At this point, you may re-open the
bug. Please do not abuse this. If a developer closes the bug a
second or third time, chances are that your bug is closed.
-
RESOLVED - A firm decision has been taken on the bug. Usually goes onto
FIXED to indicate the bug is solved and the matter closed although various
other resolutions are possible. We'll look into those a little later.
-
VERIFIED - The steps take to work the bug are correct. This is usually a QA
thing.
-
CLOSED - Basically means RIP for the bug and it's buried under the never
ending flow of new bugs.
Now shortly afterward, we find the error in the strace log and fix the bug and
mark it as RESOLVED FIXED and mention that there was a change in the location
of configuration files, and that I will update the ebuild with a warning about
it. The bug now becomes resolved, and you are shown the following.
Figure 7.8: Resolved Bug |
|
A little below, you'll see the following:
Figure 7.9: Bug Options |
|
This gives you the option of Reopening the bug if you wish to (i.e. the
developer thinks it's resolved but it's really not to your standards). Now our
bug is fixed! However, different resolutions can occur. Here's a small list:
-
FIXED - The bug is fixed, follow the instructions to resolve your issue.
-
INVALID - You did not do something specifically documented, causing the
bug.
- DUPLICATE - You didn't use this guide and reported a duplicate bug.
-
WORKSFORME - Developer/person assigned the bug cannot reproduce your error.
-
CANTFIX - Somehow the bug cannot be solved because of certain
circumstances. These circumstances will be noted by the person taking the
bug.
-
WONTFIX - This is usually applied to new ebuilds or feature requests.
Basically the developer does not want to add a certain feature because it
is not needed, a better alternative exists, or it's just plain broken.
Sometimes you may be given a solution to get said issue resolved.
-
UPSTREAM - The bug cannot be fixed by the Gentoo development team, and have
requested you take the problem upstream (the people that actually made the
program) for review. Upstream has a few ways of handling bugs. These
include mailing lists, irc channels, and even bug reporting systems. If
you're not sure how to contact them, ask in the bug and someone will point
you to the right direction.
Sometimes, before the bug can be resolved, a developer may request that you
test an updated ebulid. In the next chapter we'll take a look at testing
ebuilds.
8. Testing Ebuilds
Getting The Files
Let's say that you reported a bug for the foobar2 compile fix from earlier. Now
developers might find out what the problem is and might need you to test the
ebuild for them to be sure it works for you as well:
Figure 8.1: Ebuild Test Request |
|
Some rather confusing vocabulary is used here. First off, let's see what an
overlay is. An overlay is a special directory like /usr/portage,
the difference being that when you emerge sync, files contained within it
will not be deleted. Luckily, a special /usr/local/portage
directory is created for that purpose. Let's go ahead and set our portage
overlay in/etc/make.conf. Open make.conf up in your favorite editor
and add this towards the end.
Code Listing 8.1: Setting Up PORTDIR_OVERLAY |
PORTDIR_OVERLAY="/usr/local/portage"
|
Now we'll want to create the appropriate directories to put our test ebuild
files in. In this case, we're supposed to put them in sys-apps/foobar2. You'll
notice that the second comment asks for a files directory for the patch. The
files directory holds the digests (md5sums of files for a particular version of
a package) and any other required files that aren't included with the standard
source archive (patches, init.d scripts, etc). This is a subdir in the package
directory called files. Go ahead and create these directories:
Code Listing 8.2: Setting Up The Category And Package Directories |
# mkdir -p /usr/local/portage/sys-apps/foobar2/files
|
Note:
The -p in mkdir creates not only the directory you want but also any missing
parent directories as well (sys-apps and foobar2 in this case).
|
Ok now, we can go ahead and download the files. First, download the ebuild
into /usr/local/portage/sys-apps/foobar2, and then add the patch
to /usr/local/portage/sys-apps/foobar2/files. Now that we have the
files, we can begin working on testing the ebuild.
Testing The ebuild
The process to create an ebuild that can be used by emerge is fairly simple. You
must create a Manifest and a digest file for the ebuild. This can be done with
the ebuild command. Run it as shown.
Code Listing 8.3: Creating the Manifest and digest files |
# ebuild foobar2-1.0.ebuild digest
>>> Generating digest file...
<<< foobar2-1.0.tar.bz2
>>> Generating manifest file...
<<< foobar2-1.0.ebuild
<<< files/digest-foobar2-1.0
<<< files/foobar2-1.0-Makefile.patch
>>> Computed message digests.
|
Now let's test to see if it works as it should.
Code Listing 8.4: Testing With emerge -pv |
# emerge -pv foobar2
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild N ] sys-apps/foobar2-1.0 0 kB [1]
Total size of downloads: 0 kB
Portage overlays:
[1] /usr/local/portage
|
It does seem to have worked! You'll notice the [1] next to the [ebuild] line.
That points to /usr/local/portage, which is the overlay we created
earlier. Now we go ahead and emerge the package.
Code Listing 8.5: Emerge Result |
# emerge foobar2
Calculating dependencies ...done!
>>> Unpacking foobar2-1.0.tar.bz2 to /var/tmp/portage/foobar2-1.0/work
* Applying foobar2-1.0-Makefile.patch ... [ ok ]
>>> Merging sys-apps/foobar2-1.0 to /
>>> chris +sandbox(preinst)
--- /usr/
--- /usr/bin/
>>> /usr/bin/foobar2
|
In the first section we see that the emerge started off as it should. The second
section shows our patch being applied successfully by the "[ ok ]" status
message to the right. The last section tells us the program compiled ok. The
patch works! Now we can go and let the developer know that their patch works
fine, and that they can commit the fix to portage.
Conclusion
This concludes the howto on working with Bugzilla. I hope you find this useful.
If you have any questions, comments, or ideas regarding this document, please
send them to me at chriswhite@gentoo.org. Special thanks go to
moreon for his notes on -g flags and compile errors, the people at #gentoo-bugs
for helping out with bug-wrangling, Griffon26 for his notes on
maintainer-needed, robbat2 for general suggestions and fox2mike for fixing up
the doc and adding stuff as needed.
The contents of this document are licensed under the Creative Commons -
Attribution / Share Alike license.
|