Archive for planet ltc

breaking code into reviewable patches

Posted in english with tags , , , , , , , , , , on Wednesday, April 30, 2008 by bauermann

As I mentioned before, I’ve been working on and off on adding Python scripting support to GDB, with Tom Tromey and Vladimir Prus. We did the work in a git repository, separate from the GDB main repo (which still uses CVS, by the way). Now came the time to get the work we did there, separate it in patches and post them for review on the gdb-patches mailing list.

This is the tale of my patch-producing efforts. I’m sorry, it is most likely boring for everyone but me. Still, I wanted to write it down so you are free to stop reading the post here. :-)

Anyway, back to where I was: I (foolishly, perhaps?) volunteered to create the patches. One reason for me to do that is that I actually enjoy working with and learning about source code management and related issues, and this was a good opportunity for me to improve my git-fu (since I thought git could help me do the job in a sane way, which fortunately proved to be the case).

I say foolishly because I thought it wouldn’t take too much time to cut out the patches, since I knew what I would have to do… The task of course took longer than I expected, in part because of unforeseen autotools woes, but of course also because I underestimated the effort (I am an optimist).

Here is the method I used:

First of all, I wanted to update the code to the latest CVS version of GDB, because the work in the git repo was done based on a CVS version from February… Nothing to see here, actually. I just created a new branch with the latest CVS update, and rebased the commits on top of that. In hindsight, I should have merged the new CVS update into the python branch, which would have made me deal with less conflicts. I used rebase because I thought I would cherry pick the commits later, so I wanted each of them refreshed.

Then the real fun began. I started using interactive mode of git rebase to squash related commits together (to form the patches), and reorder them. I quickly realised that with this approach I would have a bit of difficulty with commits which touched different areas of the code and crossed the borders I had in my mind for the patches I wanted to generate. I would have to first split those into smaller, more behaving commits and only then squash them with other similar changes. That seemed to be more work than really necessary.

Also, the older commits did things in ways and places which were later changed, and it looked like I would have some trouble reconciling older and newer code to fit in one patch (maybe not though, maybe that would be taken care of more or less naturally). Also, I would need to take some time to familiarise myself with the commits in the branch, because I only authored some of them. The “shuffle commits around” approach wasn’t looking very promising.

I then turned to a different strategy: I generated a big patch containing all of the code in the branch, and applied it (using the plain old patch command) on top of a clean branch which contained only the CVS HEAD version I was using as a base. All I needed to do now was to selectively add to the index the changes that I wanted to include in a patch and then commit those changes together. And repeat the process for the next patch and so on.

It proved to be a good approach, especially because of the interactive mode of git-add. This mode asks you about each change inside a modified file, letting you add that change to the index or skip it, leaving it in the working directory for a future commit. git add -i streamlined the “change picking” process quite a lot, and made the patch-cutting almost mechanical. (By the way, this feature is also available in Mercurial, with the Record extension. I even believe (not sure though) that the Mercurial extension predates git add -i) (I don’t know if Bazaar has it, would be nice to know).

In this phase of the process, git rebase -i was useful. Sometimes I came accross a change in the working directory which would fit better in a patch which I had already committed. It was simply a matter of committing that change and then shuflling it back and squashing with the proper patch.

At each commit I pushed the changes to a pristine repo which I used to build GDB and guarantee that each patch included all the changes it needed.

Voilà, at the end of the process I had a git branch where each commit corresponded to one patch which I wanted to send to the mailing list.

new GDB release, and decimal floating point

Posted in english with tags , , , , , , , on Monday, March 31, 2008 by bauermann

GDB version 6.8 was released just a few days ago. I’m happy to have made my small contribution to it, mostly with development of decimal floating point debugging support. From the NEWS file:

“GDB now supports debugging C and C++ programs which use the Decimal Floating Point extension. In addition, the PowerPC target now has a set of pseudo-registers to inspect decimal float values stored in two consecutive float registers.”

The feature was actually developed by several folks. Ben Elliston started working on the feature, and then passed it on to Wu Zhou. I took up where Wu Zhou left and implemented more complete support for decimal float types. Luis Machado also helped me and posted some patches of his own. The work amounted to a total of about 12 patches.

It means that you can now use GDB (version 6.8 or later) to debug programs which make use of the proposed C extension for decimal floating-point arithmetic (i.e., the _Decimal32, _Decimal64 and _Decimal128 types). The first GCC release with support for this extension was GCC 4.2.

Why is decimal floating point useful? It avoids the unexpected surprises and rounding errors which inevitably come with binary floating point. It’s not that decimal float is more exact or precise, it’s just that it behaves just like we are used to and were thought in school in terms of representation and rounding.

GDB itself can provide an example:

(gdb) p 1.2l
$1 = 1.2000000000000000000433680868994202
(gdb) ptype 1.2l
type = long double
(gdb) p 1.2dl
$2 = 1.2
(gdb) ptype 1.2dl
type = _Decimal128

You can see that the actual value used to represent 1.2 in binary floating point is slightly larger than 1.2. Why is that? It’s because to express 0.2 in binary float you need an infinite number of digits, so what ends up being stored is the closest number possible to represent in binary. The difference is almost nothing, but this error will propagate in computations and eventually be big enough to be noticed. That’s why in some application domains (e.g., finance and civil construction), you are actually required by law to use decimal floating point to perform calculations.

More information about decimal float can be found in Mike Cowlishaw’s page.

gdb’s backtrace command implemented in python

Posted in english with tags , , , , , , , on Monday, March 24, 2008 by bauermann

I’ve been working on Python bindings for exposing GDB’s frame_info, the internal structure it uses to keep track of the frame stack in the debuggee (or inferior, in GDB parlance). I got just enough working to be able to implement an equivalent of GDB’s backtrace command entirely in Python. The difference is that my version of the command prints older frames first and newer last, which feels more natural to me. :-)

Here’s the output I get:

(gdb) rbt
#2 0x080483bb in main at ../../src/examples/funcs.c:15
#1 0x08048391 in f1 at ../../src/examples/funcs.c:10
#0 f2 at ../../src/examples/funcs.c:5
(gdb)

A little bit more information, and the definition of the Python command which does the above can be found in my post to the mailing list. The code is on the git repo for the Python work.

new linker for Linux and others ELF OSes

Posted in english with tags , , , , , on Saturday, March 22, 2008 by bauermann

Cool, Ian Taylor (who wrote the current linker used in Linux) just announced that gold, the new linker that he has been writing, was just released. It targets only ELF systems, so I believe its design is much simplified and streamlined by this.

I find it interesting that he chose to implement it in C++. I’m glad that the “let’s do it in C because everybody knows it” mantra that so frequently determines the programming language of open source projects doesn’t always prevail. Perhaps this will help weaken the argument?

And yes, I know about KDE. It’s the exception that proves the rule. :-D
Besides, don’t forget that GNOME, the project created to react to it is in C, using the horrible GObject monstrosity.

python scripting in gdb!

Posted in english with tags , , , , , , on Friday, March 14, 2008 by bauermann

It seems the planets are finally aligning to get Python scripting support in GDB! Vladimir published his changes last month, Tromey improved on them, and I joined the bandwagon.

The work is being done in a git repo hosted by gitorious. More details here.

This looks very promising.

Update – 2008/03/15: Sorry, I was a bit cryptic in this post. It’s not really about enabling debug of Python programs using GDB (which is a neat idea, and I hope to play with it sometime). It’s about integrating a Python interpreter into GDB and exposing its internals as an API to be used by Python scripts. This will enable people to automate and extend GDB functionality using Python. This feature has been asked many times before, and finally is being addressed. Should open many possibilities.