⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bug-reporting.html

📁 gcc手册
💻 HTML
字号:
<html lang="en">

<head>

<title>Using the GNU Compiler Collection (GCC)</title>

<meta http-equiv="Content-Type" content="text/html">

<meta name="description" content="Using the GNU Compiler Collection (GCC)">

<meta name="generator" content="makeinfo 4.3">

<link href="http://www.gnu.org/software/texinfo/" rel="generator-home">

<!--

Copyright &copy; 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,

1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.



   <p>Permission is granted to copy, distribute and/or modify this document

under the terms of the GNU Free Documentation License, Version 1.2 or

any later version published by the Free Software Foundation; with the

Invariant Sections being "GNU General Public License" and "Funding

Free Software", the Front-Cover texts being (a) (see below), and with

the Back-Cover Texts being (b) (see below).  A copy of the license is

included in the section entitled "GNU Free Documentation License".



   <p>(a) The FSF's Front-Cover Text is:



   <p>A GNU Manual



   <p>(b) The FSF's Back-Cover Text is:



   <p>You have freedom to copy and modify this GNU Manual, like GNU

     software.  Copies published by the Free Software Foundation raise

     funds for GNU development.-->

</head>

<body>

<div class="node">

<p>

Node:<a name="Bug%20Reporting">Bug Reporting</a>,

Next:<a rel="next" accesskey="n" href="gccbug.html#gccbug">gccbug</a>,

Previous:<a rel="previous" accesskey="p" href="Bug-Lists.html#Bug%20Lists">Bug Lists</a>,

Up:<a rel="up" accesskey="u" href="Bugs.html#Bugs">Bugs</a>

<hr><br>

</div>



<h3 class="section">How to Report Bugs</h3>



   <p>The fundamental principle of reporting bugs usefully is this:

<strong>report all the facts</strong>.  If you are not sure whether to state a

fact or leave it out, state it!



   <p>Often people omit facts because they think they know what causes the

problem and they conclude that some details don't matter.  Thus, you might

assume that the name of the variable you use in an example does not matter. 

Well, probably it doesn't, but one cannot be sure.  Perhaps the bug is a

stray memory reference which happens to fetch from the location where that

name is stored in memory; perhaps, if the name were different, the contents

of that location would fool the compiler into doing the right thing despite

the bug.  Play it safe and give a specific, complete example.  That is the

easiest thing for you to do, and the most helpful.



   <p>Keep in mind that the purpose of a bug report is to enable someone to

fix the bug if it is not known.  It isn't very important what happens if

the bug is already known.  Therefore, always write your bug reports on

the assumption that the bug is not known.



   <p>Sometimes people give a few sketchy facts and ask, "Does this ring a

bell?"  This cannot help us fix a bug, so it is basically useless.  We

respond by asking for enough details to enable us to investigate. 

You might as well expedite matters by sending them to begin with.



   <p>Try to make your bug report self-contained.  If we have to ask you for

more information, it is best if you include all the previous information

in your response, as well as the information that was missing.



   <p>Please report each bug in a separate message.  This makes it easier for

us to track which bugs have been fixed and to forward your bugs reports

to the appropriate maintainer.



   <p>To enable someone to investigate the bug, you should include all these

things:



     <ul>

<li>The version of GCC.  You can get this by running it with the

<code>-v</code> option.



     <p>Without this, we won't know whether there is any point in looking for

the bug in the current version of GCC.



     </p><li>A complete input file that will reproduce the bug.  If the bug is in the

C preprocessor, send a source file and any header files that it

requires.  If the bug is in the compiler proper (<code>cc1</code>), send the

preprocessor output generated by adding <code>-save-temps</code> to the

compilation command (see <a href="Debugging-Options.html#Debugging%20Options">Debugging Options</a>).  When you do this, use

the same <code>-I</code>, <code>-D</code> or <code>-U</code> options that you used in

actual compilation.  Then send the <var>input</var>.i or <var>input</var>.ii files

generated.



     <p>A single statement is not enough of an example.  In order to compile it,

it must be embedded in a complete file of compiler input; and the bug

might depend on the details of how this is done.



     <p>Without a real example one can compile, all anyone can do about your bug

report is wish you luck.  It would be futile to try to guess how to

provoke the bug.  For example, bugs in register allocation and reloading

frequently depend on every little detail of the function they happen in.



     <p>Even if the input file that fails comes from a GNU program, you should

still send the complete test case.  Don't ask the GCC maintainers to

do the extra work of obtaining the program in question--they are all

overworked as it is.  Also, the problem may depend on what is in the

header files on your system; it is unreliable for the GCC maintainers

to try the problem with the header files available to them.  By sending

CPP output, you can eliminate this source of uncertainty and save us

a certain percentage of wild goose chases.



     </p><li>The command arguments you gave GCC to compile that example

and observe the bug.  For example, did you use <code>-O</code>?  To guarantee

you won't omit something important, list all the options.



     <p>If we were to try to guess the arguments, we would probably guess wrong

and then we would not encounter the bug.



     </p><li>The type of machine you are using, and the operating system name and

version number.



     <li>The operands you gave to the <code>configure</code> command when you installed

the compiler.



     <li>A complete list of any modifications you have made to the compiler

source.  (We don't promise to investigate the bug unless it happens in

an unmodified compiler.  But if you've made modifications and don't tell

us, then you are sending us on a wild goose chase.)



     <p>Be precise about these changes.  A description in English is not

enough--send a context diff for them.



     <p>Adding files of your own (such as a machine description for a machine we

don't support) is a modification of the compiler source.



     </p><li>Details of any other deviations from the standard procedure for installing

GCC.



     <li>A description of what behavior you observe that you believe is

incorrect.  For example, "The compiler gets a fatal signal," or,

"The assembler instruction at line 208 in the output is incorrect."



     <p>Of course, if the bug is that the compiler gets a fatal signal, then one

can't miss it.  But if the bug is incorrect output, the maintainer might

not notice unless it is glaringly wrong.  None of us has time to study

all the assembler code from a 50-line C program just on the chance that

one instruction might be wrong.  We need <em>you</em> to do this part!



     <p>Even if the problem you experience is a fatal signal, you should still

say so explicitly.  Suppose something strange is going on, such as, your

copy of the compiler is out of synch, or you have encountered a bug in

the C library on your system.  (This has happened!)  Your copy might

crash and the copy here would not.  If you <i>said</i> to expect a crash,

then when the compiler here fails to crash, we would know that the bug

was not happening.  If you don't say to expect a crash, then we would

not know whether the bug was happening.  We would not be able to draw

any conclusion from our observations.



     <p>If the problem is a diagnostic when compiling GCC with some other

compiler, say whether it is a warning or an error.



     <p>Often the observed symptom is incorrect output when your program is run. 

Sad to say, this is not enough information unless the program is short

and simple.  None of us has time to study a large program to figure out

how it would work if compiled correctly, much less which line of it was

compiled wrong.  So you will have to do that.  Tell us which source line

it is, and what incorrect result happens when that line is executed.  A

person who understands the program can find this as easily as finding a

bug in the program itself.



     </p><li>If you send examples of assembler code output from GCC,

please use <code>-g</code> when you make them.  The debugging information

includes source line numbers which are essential for correlating the

output with the input.



     <li>If you wish to mention something in the GCC source, refer to it by

context, not by line number.



     <p>The line numbers in the development sources don't match those in your

sources.  Your line numbers would convey no useful information to the

maintainers.



     </p><li>Additional information from a debugger might enable someone to find a

problem on a machine which he does not have available.  However, you

need to think when you collect this information if you want it to have

any chance of being useful.



     <p>For example, many people send just a backtrace, but that is never

useful by itself.  A simple backtrace with arguments conveys little

about GCC because the compiler is largely data-driven; the same

functions are called over and over for different RTL insns, doing

different things depending on the details of the insn.



     <p>Most of the arguments listed in the backtrace are useless because they

are pointers to RTL list structure.  The numeric values of the

pointers, which the debugger prints in the backtrace, have no

significance whatever; all that matters is the contents of the objects

they point to (and most of the contents are other such pointers).



     <p>In addition, most compiler passes consist of one or more loops that

scan the RTL insn sequence.  The most vital piece of information about

such a loop--which insn it has reached--is usually in a local variable,

not in an argument.



     <p>What you need to provide in addition to a backtrace are the values of

the local variables for several stack frames up.  When a local

variable or an argument is an RTX, first print its value and then use

the GDB command <code>pr</code> to print the RTL expression that it points

to.  (If GDB doesn't run on your machine, use your debugger to call

the function <code>debug_rtx</code> with the RTX as an argument.)  In

general, whenever a variable is a pointer, its value is no use

without the data it points to. 

</ul>



   <p>Here are some things that are not necessary:



     <ul>

<li>A description of the envelope of the bug.



     <p>Often people who encounter a bug spend a lot of time investigating

which changes to the input file will make the bug go away and which

changes will not affect it.



     <p>This is often time consuming and not very useful, because the way we

will find the bug is by running a single example under the debugger with

breakpoints, not by pure deduction from a series of examples.  You might

as well save your time for something else.



     <p>Of course, if you can find a simpler example to report <em>instead</em> of

the original one, that is a convenience.  Errors in the output will be

easier to spot, running under the debugger will take less time, etc. 

Most GCC bugs involve just one function, so the most straightforward

way to simplify an example is to delete all the function definitions

except the one where the bug occurs.  Those earlier in the file may be

replaced by external declarations if the crucial function depends on

them.  (Exception: inline functions may affect compilation of functions

defined later in the file.)



     <p>However, simplification is not vital; if you don't want to do this,

report the bug anyway and send the entire test case you used.



     </p><li>In particular, some people insert conditionals <code>#ifdef BUG</code> around

a statement which, if removed, makes the bug not happen.  These are just

clutter; we won't pay any attention to them anyway.  Besides, you should

send us cpp output, and that can't have conditionals.



     <li>A patch for the bug.



     <p>A patch for the bug is useful if it is a good one.  But don't omit the

necessary information, such as the test case, on the assumption that a

patch is all we need.  We might see problems with your patch and decide

to fix the problem another way, or we might not understand it at all.



     <p>Sometimes with a program as complicated as GCC it is very hard to

construct an example that will make the program follow a certain path

through the code.  If you don't send the example, we won't be able to

construct one, so we won't be able to verify that the bug is fixed.



     <p>And if we can't understand what bug you are trying to fix, or why your

patch should be an improvement, we won't install it.  A test case will

help us to understand.



     <p>See <a href="http://gcc.gnu.org/contribute.html">http://gcc.gnu.org/contribute.html</a>

for guidelines on how to make it easy for us to

understand and install your patches.



     </p><li>A guess about what the bug is or what it depends on.



     <p>Such guesses are usually wrong.  Even I can't guess right about such

things without first using the debugger to find the facts.



     </p><li>A core dump file.



     <p>We have no way of examining a core dump for your type of machine

unless we have an identical system--and if we do have one,

we should be able to reproduce the crash ourselves. 

</ul>



   </body></html>



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -