Durch ein sehr simples Demo-Programm aus dem lokalen IRC-Channel bin ich inspiriert worden, das ganze etwas zu verbessern, und ein paar simple Funktionen zu schreiben, mit denen man zur Laufzeit erkennen kann, ob innerhalb eines bestimmten Code ein Breakpoint gesetzt worden ist. Den Code dazu gibt's hier zum anschauen, und hier eine kurze Session: $ gcc -g antibreak.c -o antibreak
$ ./antibreak
i=0
i=1
i=2
$ gdb antibreak
GNU gdb 6.3-debian
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 "i386-linux"...Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) break antibreak.c:11
Breakpoint 1 at 0x8048408: file antibreak.c, line 11.
(gdb) break antibreak.c:19
Breakpoint 2 at 0x804843d: file antibreak.c, line 19.
(gdb) break antibreak.c:32
Breakpoint 3 at 0x80484ce: file antibreak.c, line 32.
(gdb) r
Starting program: /home/ak/antibreak/antibreak
found breakpoint at address 0x0x8048408
found breakpoint at address 0x0x804843d
found breakpoint at address 0x0x80484ce
Program exited with code 01.
(gdb) quit
$
Um das gleich mal am anfang zu klären: ja, das funktioniert auch ohne -g, allerdings kann man dann im gdb keine Breakpoints auf Zeilennummern setzen.
Der Hintergrund: gdb setzt Breakpoints, indem der Maschinencode im Speicher so verändert wird, dass an der jeweiligen Stelle ein INT 3 (Opcode 0xCC) reingeschrieben wird.. Wird diese Stelle nun ausgeführt, löst dieser INT 3 einen Trap aus, bei dem sich gdb reinhängt, und vor einem Continue an die Stelle noch den vorherigen Opcode reinschreibt.
Die von mir geschriebenen Funktionen machen es nun so, dass man eine Start- und eine Endadresse angibt, und dieser Bereich von einem simplen x86 Opcode Decoder angeschaut wird, und wenn ein INT 3 gefunden wird, wird die Adresse der Instruktion zurrückgeliefert. Von diesem Punkt weg kann man dann solange weitere INT-3-Instruktionen suchen, bis man die Endadresse erreicht hatt. Den Opcode Decoder hab ich übrigens nicht selbstgeschrieben, sondern über Google gefunden, und für kompakt genug befunden, um den schnell mal via copy/paste zu verwenden. Als End-Adresse hab ich übrigens in allen Fällen die Startadresse der nächsten Funktion im Sourceode verwendet. Klar, das verlässt sich auf ein gcc-spezifisches Verhalten, aber hey, das ganze ist sowieso auch x86-spezifisch, also, was soll's?
Wer übrigens noch mehr über ein paar nette Anti-Debugging-Techniken unter Linux lesen möchste (kein Voodoo-Techniken, aber trotzdem ganz interessant für n00bs wie mich), dem kann ich nur diesen Text empfehlen.
Wie ich übrigens aus gut informierten Kreisen erfahren habe, gibt es noch eine andere Debugging-Technik, die auf den Debug-Registern des x86 aufbauen, und das dürfte von neueren gdb-Versionen schon (teilweise) unterstützt werden. Insofern ist nicht garantiert, dass das in Zukunft auch nur irgendwie funktioniert.
Dass mutt-ng so ziemlich eingeschlafen ist, wird mittlerweile jeder bemerkt haben, der mutt-ng selber verwendet. Tja, der Grund dafür ist, dass ich in Retrospektive betrachtet einfach nicht wusste, wie man das anzugehen hatte, um das ganze manageable zu halten. Insbesondere um das Mergen von Änderungen in upstream hab ich mir keine Gedanken gemacht, aber auch sonst wusste ich noch nicht so recht was über professionelles Patch-Management.
Die Probleme, die daraus resultieren, sind natürlich mannigfaltig: neue Features in mutt waren schwierig zu mergen, und das Tracken von Security Fixes ebenso problematisch. Irgendwann war dann ein Punkt erreicht, wo ich nicht mehr so recht motiviert war, da noch wirklich weiter dran zu arbeiten. Der damalige Stress in der Arbeit und schließlich das Bundesheer trugen ihr übriges dazu bei. Und auch die anderen Entwickler sahen die Probleme, die es bei mutt-ng gab.
Da aber mutt-ng doch einige sehr praktische Patches und Fixes enthält, die ihren Weg bis jetzt nicht in mutt gefunden haben, hab ich mich jetzt aufgerafft, und mir ein paar Gedanken gemacht, wie man denn das ganze besser machen kann, nachvollziehbarer, und vor allem so, dass Patches auch unproblematisch ihren Einzug in das offizielle mutt halten könnten. An Tools, um das Patch-Management zu unterstützen, hatte ich dazu transvn (welches auf Subversion aufbaut) und stgit (welches auf git aufbaut, das bei der Kernel-Entwicklung eingesetzt wird) evaluiert, mit keinem der beiden Tools war ich jedoch so wirklich zufrieden. Während sich transvn regelmäßig sein Repository zerschoss, und damit praktisch unbrauchbar war, hat git mit stgit doch den Vorteil, den Export und vor allem inkrementelle Updates aus CVS- und Subversion-Repositories zu unterstützen. So richtig zufrieden war ich damit jedoch nicht, weil es ja eine Bindung an ein bestimmtes Versionsverwaltungstool bedeutete. Und meine Anforderungen lagen nicht primär in der Versionsverwaltung, sondern im Patchmangement.
Mika hat mich dann freundlicherweise auf quilt verwiesen, ein Tool, dessen einziger Zweck Patchmanagement darstellt, unabhängig von jeder Versionsverwaltung, jedoch damit kombinierbar. Quilt verfolgt das Konzept eines Stacks, also ein Stapel von Patches. Man nimmt einen ungepatchten Sourcetree, sowie diesen Patchstapel, und kann einen Patch nach dem anderen, oder auch alle auf einmal hintereinander, applien. Wenn es ein Problem mit einem Patch gibt, so schreit quilt, und man kann dann manuell intervenieren, indem man z.B. den Patch durch einen aktuelleren ersetzt, oder den Patch trotzdem anwendet, und die fehlgeschlagenen Teile manuell einfügt. Damit kann es zwar zu Abhängigkeiten von Patches untereinander kommen, wenn diese etwa die gleichen Stellen oder sehr nahe beieinanderliegende Stellen im Source patchen. Praktisch hat sich dieses System jedoch bewährt, so schreibt eine wirkliche gute Einführung in quilt, die man bei SuSE findet, vom Extremfall, dass es zu einem Sourcetree wie dem Linux-Kernel mehr als tausend Patches zu verwalten gäbe, und dass das Ziel der Entwicklung von quilt es war, die SuSE-Kernelsourcen besser verwaltbar zu machen.
Nachdem ich also endlich die passenden Werkzeuge zur Verfügung hatte, hab ich mich gestern und heute hingesetzt, die Patches, die in mutt-ng eingeflossen sind, in aktuellen Versionen zu sammeln, sowie meine eigenen Änderungen aus mutt-ng zu extrahieren (wobei ich größtenteils auf frühere Versuche mit stgit zurückgreifen konnte), und mutt-ng neu zu bauen. Die Patches verwalte ich mich mit quilt, und das patches-Verzeichnis speichere ich in meinem Subversion-Repository. Mittlerweile ist dieser neuerliche Versuch schon soweit, dass ich sagen kann, dass ich ganz zufrieden bin mit der Funktionalität. An ein paar Stellen hakt es zwar noch, aber die hoffe ich in den nächsten Tagen beheben zu können, und das noch dazu in einer Form, die an die ursprünglichen Autoren zurückfließen können. Die derzeitigen Patches sind gegen das Release 1.5.12, bald werde ich jedoch versuchen, die Patches auf den CVS-Tree von mutt anzupassen.
Und so holt man sich die Patches und applied sie: $ svn co http://bereshit.synflood.at/svn/mutt-patches/trunk/ mutt-patches
[...]
$ export PATCHES_DIR=`pwd`/mutt-patches/patches
$ cd $MUTTDIR
$ ln -s $PATCHES_DIR patches
$ quilt push -a
[...]
$ ./prepare
[...]
$ ./configure --your-favorite-options
[...]
$ make
Wie schon oben geschrieben, getestet ist das derzeit nur mit mutt 1.5.12.
So richtig öffentlich möchte ich das noch nicht stellen, da ich das ganze einerseits noch "runder" machen will und andererseits noch mehr Erfahrung im Patchmanagement sammeln will, insbesondere beim Einspielen von neuen Versionen der Patches.
Was mich im übrigens im Zuge der Arbeiten gestern und heute auch erstaunt hat, war, wieviel sich bei mutt mittlerweile getan hat. Header-Caching ist dazugekommen, und auch der GNUTLS-Patch wurde offenbar integriert. Immerhin diesen positiven Effekt hatte mutt-ng, nämlich die mutt-Entwicklergemeinde wachzurütteln, und klarzumachen, dass soviele praktische, jedoch nicht integrierte Features verfügbar sind. Einige weitere Patches, wie NNTP-Support oder die Sidebar, die wohl beliebtesten und am meisten verwendeten Features von mutt-ng, werden wohl nicht so schnell integriert werden. Insofern hat ein neuerlicher Anlauf in Sachen mutt-ng, diesmal mehr mit Fokus auf Patchsammlung und Integration ebendieser denn einem Fork, durchaus seine Berechtigung.
nion und ich haben heute in der Nacht w3bfukk0r 0.2 released. Als wichtigste Änderungen wären HTTP/HTTPS-Proxy-Support, jede Menge Bugfixes, die Möglichkeit, mehrere URLs zu scannen, eine neue Manpage und Sourcedokumentation (inkl. Doxyfile) zu nennen. Leider hat's beim freshmeat.net-Announcement einen Fuckup gegeben, statt "It's not possible to specify more than one URL to be scanned." sollte es "It's now possible to specify more than one URL to be scanned." heissen.
nion bloggt über Spermwale, und ich verweise auf einen eher skurrilen und gleichzeitig durchaus lesenswerten Wikipedia-Artikel: Walexplosion
Und zwar werden einerseits die angewandte Methode, Walkadaver mit Hilfe von Sprengstoff zu zerkleinern, andererseits auch ein Vorfall einer natürlichen Walexplosion durch sich durch Verwesung bildende Gase behandelt.
Wer wieder mal eine wirklich gute Satire zum Thema Informatik lesen will, dem kann ich nur The Critical Voice aus der aktuellsten Ausgabe von ACM Crossroads empfehlen. Zufälligerweise kenne ich den Autor persönlich (ja, das ist ein Pseudonym), und so hört man, dass das der Anfang einer ganzen Serie werden soll.
Mein Lieblingszitat ist ja
[...] we can also conclude that P = NP, although I never quite understood what was so difficult about that in the first place. How about N = 1, huh?
Heute hatte ich mal so richtig Lust, mal was völlig anderes als sonst zu kochen. Spontan ist mir da die thailändische Küche eingefallen. Also hab ich Google angeworfen, mir diverse thailändische Rezepte rausgesucht, und mir so angeschaut, was da typischerweise drinnen ist. Da hab ich dann eine Liste zusammengeschrieben, und alle Sachen weggestrichen, die ich ohne viel Aufwand (d.h. extra zu einem Asiashop latschen, von denen keiner bei mir in der Nähe ist) in meiner Nähe kriegen würde. Diese übrig gebliebene Liste hab ich dann genommen, und eingekauft, was ich davon kriegen konnte. Letztendlich verwendet hab ich dann Truthahnbrust, generisches Wokgemüse, Limetten, Fischsauce, Currypaste, Kokosmilch und Basmati-Reis.
Zuerst hab ich die Truthahnbrustfilets in kleine Streifen geschnitten, eine Pfanne mit Öl erhitzt, und einen Teil des Wokgemüses reingetan und angebraten. Dann noch mehr Öl, und die Truthahnbruststreifen scharf angebraten. Als nächsten Schritt hab ich dann etwa die Hälfte der Kokosmilch dazugegossen, das ganze schön verrührt und gleichzeitig die Hitze runtergestellt. Parallel dazu habe ich Wasser aufgesetzt, gesalzen und, als es gekocht hat, den Basmati-Reis reingetan. Der nächste Schritt war, von der Currypaste etwas in die Pfanne zu tun (knap ein Esslöffel, und wie sich später herausstellte, wohl etwas zuviel), und ebenfalls zu verrühren. Dann noch ca. ein Esslöffel Fischsauce dazu, sowie eine Limette reingepresst.
Schließlich hab ich das ganze noch weiterköcheln lassen, um das ganze zu reduzieren, die ganze Kokosmilch stellte doch eine beträchtliche Menge Flüssigkeit dar. Als der Reis dann fertig war, war die Sauce in der Pfanne schon dickflüssiger, und fertig, gegessen zu werden. Also, das ganze auf ein Teller, den Reis dazu (der mir auch nicht perfekt gelungen ist, zumindest will man "al dente" bei Reis nicht, aber halb so schlimm). Dazu getrunken hab ich ein typisch thailändisches Gösser-Bier.
Alles in allem muss ich sagen, dass ich Zubereitung relativ einfach und straight-forward war, und auch nicht allzuviel Zeit in Anspruch genommen hat. Nicht ganz so cool war das offenbar etwas zu starke Würzen mit der Currysauce, ein halber EL hätte es auch getan. Aber das ganze war trotzdem sehr gut, wenn auch geschmacklich äußerst intensiv. Alles in allem wirklich weiterzuempfehlen, gerade, wenn man z.B. Gäste mit etwas Exotischem bekochen will.
Wie hier schon erwähnt, bietet Pearl Jam Bootlegs von allen Konzerten der Europa-Tour an, zu moderaten US-$ 9,99 pro Konzert (immerhin mehr als 2 Stunden Musik). Mittlerweile ist auch der Mitschnitt von Wien erhältlich, welchen ich mir heute gekauft habe. Tja, und ich muss sagen, diese Liveaufnahmen sind wirklich genial. Vor allem, wenn man selbst auf dem Konzert war, und sich genau erinnern kann, wie dieser und jener Song war, und man das dann auch in den Aufnahmen wiedererkennt. Ausserdem hört man klanglich wesentlich feinere Aspekte heraus, als das bei einem Livekonzert möglich ist. Alles in allem ein besonderes Stück Livemusik.
Tja, schon wieder vorüber ist sie, die erste Arbeitswoche bei meinem neuen Arbeitgeber. Anfangs war es etwas stressig, weil ich mich natürlich in das Produkt, an dem ich mitarbeiten werde, einarbeiten musste. Mittlerweile funktioniert das aber schon halbwegs gut (für die kurze Zeit), und ich hab schon so Sachen gemacht wie mit der hauseigenen Library, die primär verwendet wird, experimentiert, Erweiterungen für die eingebaute Skriptsprache entwickelt, und arbeite derzeit an einem kleinen Tool, das künftighin das eine oder andere mal gebraucht werden wird. Alles in allem wirklich interessant, und ich bin so motiviert bei der Arbeit wie schon lange nicht mehr. Ich merke, die Veränderung hat mir wirklich gut getan.
Martin weist mich auf einen Artikel auf orf.at hin, und zwar schafft der Papst die Vorhölle ab. Tja, toll. Eigentlich zeigt das doch die absolute Lächerlichkeit des gesamten Systems. Wenn der Papst so direkten Einfluss auf doch nicht unwesentliche Glaubensinhalte hat, so muss man sich die Frage stellen: glaubt der Papst denn daran? Nun, gehen wir mal beide Antwortmöglichkeiten durch.
Ja, wenn der Papst daran glaubt, was heißt das? Wenn wir annehmen, dass alle Päpste daran geglaubt haben, dann bedeutet das, dass der Glaube die Summe der Glaubensvorstellungen der Mächtigen (es hat ja nicht immer allein der Papst bestimmt, siehe diverse Konzile) ist. Der Katholizismus erhält damit eine gewisse Beliebigkeit, und bedingt durch die innere Struktur wird der Glauben von wenigen einer Menge von vielen faktisch aufgezwungen (auch wenn es manche Bewegungen gibt, die weniger dogmatisch denken und handeln).
Aber was ist, wenn der Papst nicht daran glaubt? Dann ist es umso schlimmer, als dass die Beliebigkeit noch eine Stufe weiter getrieben wird. Aus vollkommener Willkür heraus werden Glaubensinhalte "einfach so" verändert, einen Zusammenhang mit irgendeiner Art von Glauben besteht da nicht mehr.
Aber egal, was die wirkliche Antwort ist, so ist das ganze sowieso symptomatisch für die absolute Beliebigkeit des katholischen Glaubens. Und der absolute Brüller ist sowieso der Grund, warum der Papst das abgeschafft hat:
Laut der britischen Tageszeitung "Times" soll Papst Benedikt noch vor seiner Wahl zum Kirchenoberhaupt gesagt haben: "Ich persönlich würde es aufgeben, da es immer nur eine Hypothese war."
Heute hatte ich meinen ersten Arbeitstag bei Borland, und ich muss sagen, es ist äußerst erfrischend, nach längerer Zeit wieder an etwas völlig anderem als bisher in einer komplett anderen Umgebung als bisher zu arbeiten. Heute stand nur administrativer Kleinkram und eine Einführung in das Produkt, an dessen Entwicklung ich mitarbeiten werde, sowie erste Programmierexperimente mit den Libraries am Programm. Alles in allem aber bin ich höchst motiviert, und freue mich schon auf die nächsten paar Tage.
Durch meinen Salzburg-Aufenthalt gestern und heute bin ich bis jetzt nicht dazu gekommen, über das Pearl-Jam-Konzert zu bloggen (außer über Gentomaten).
Also, ich bin mit einem Arbeitskollegen runtergefahren. Die Wiener Stadthalle war nicht schwer zu finden, und besonders die letzten paarhundert Meter waren einfach, wir mussten nur den Menschenmassen folgen. Vorband waren Tarantula A.D., bestehend aus einem Gitarristen, einem Schlagzeuger, und einem Celloviolinisten/Keyboarder. Die Musik war eher ungewöhnlich, sehr experimentell, mit einem gewissen Metal-Einfluss, auch gewisse Einflüsse von Apocalyptica hört man heraus.
Dann, um fünf vor neun, traten endlich Pearl Jam auf. Der Auftritt war sehr wuchtig und direkt, mit Life Wasted, Corduroy und Rearviewmirror in einem durch (gesamte Setlist), und verbreitete sofort eine sehr gute, euphorische Stimmung. Besonders beeindruckend fand ich die Intensität, die rüberkommt, wenn soviele Leute mitsingen, und Eddie Vedder, der Sänger, da auch bewusst mit dem Publikum interagiert. Ich freu mich schon auf die Bootlegs, die's hoffentlich bald zu einem moderaten Preis (US-$ 9,99 fuer MP3, US-$ 14,99 fuer FLAC, beides natürlich DRM-frei) zum Download geben wird. Insgesamt dauerte das Konzert fast zweieinhalb Stunden, war stimmungsmäßig echt einzigartig, ein wirkliches Erlebnis, und sein Geld absolut wert.
Gestern, am späten Nachmittag, bin ich mit der Straßenbahn gefahren. Plötzlich habe ich bemerkt, dass sich mein Handy bemerkbar macht, und mir jemand ein File via Bluetooth (ich hatte es versehentlich aktiviert) schicken wollte. Der Dateiname war zufällig alphanumerisch, und die File-Extension war ".sis". Das kam mir höchst komisch vor, ".sis"-Files sind nämlich Symbian-OS-Installationsarchive (ähnlich .msi unter Windows). Geistesgegenwärtig habe ich das File gespeichert, um es später analysieren zu können. Wen es interessiert: pzwptq6u.sis
Leider funktioniert das "unsis"-Tool zum Extrahieren von sis-Archiven, das ich auf die schnelle gefunden habe, nicht wirklich gut (es wird nur eine Datei, nämlich commrec.mdl, extrahiert, obwohl da auch noch eine commwarrior.exe dabei sein müsste), und so konnte ich bis jetzt nur rausfinden, dass es sich bei diesem File um eine Variante von CommWarrior, einen Wurm für Symbian OS Series 60, handelt. Vor zwei Jahren, als ich eine Schulung zu Symbian OS Programmierung hatte, haben wir auch spekuliert, wie schwierig es wäre, einen Symbian-Wurm zu entwickeln, und technisch ist das kein Problem: das API zum automatischen Finden von BT-Geräten inkl. Versenden von Files etc. ist vorhanden, und nicht allzu schwierig anzusteuern. Lediglich bei der Installation ist manuelle Intervention notwendig, der User muss nämlich explizit bestätigen, dass er das sis-File installieren will. Aber offenbar, wie man oben sieht, funktioniert das.
Heute, um 19:30, startet das Pearl-Jam-Konzert in der Wiener Stadthalle. Und ich werde mit dabei sein. Nach langem, langem Warten spielt Pearl Jam endlich wieder in Wien. Das ist wohl das Konzert, auf das ich so ziemlich am längsten warte, nämlich ziemlich genau seit dem Zeitpunkt, wo ich das letzte Österreich-Konzert, 2000 am Residenzplatz in Salzburg, versäumt habe. Ach ja, Sarah Kuttner wird heute einen schweren Stand haben, bei so einer Band in der Stadt.