c/c++ function call hooking / code coverage



  • Hi,

    ich hatte vor einiger Zeit mal einen Artikel im Netz gelesen, den ich leider nicht mehr finden kann. Darin ging es um eine nicht-invasive Technik um die Code-Abdeckung von c Code auf Funktionsebene zu messen.
    Der Author hatte dazu (soweit ich mich erinnern kann u.A. mit Hilfe eines speziellen compiler switches) sämtliche Funktionsaufrufe abgefangen und dabei die Rücksprungadresse irgendwo zwischengespeichert und gepatched, so dass er sämtliche 'return's ebenfalls abfangen konnte...

    Weiß zufällig jemand, welchen Artikel ich meine bzw. wie ich c-Funktionsaufrufe abfangen kann, ohne den code anzufassen?

    (Ich brauche eigentlich nicht die Code-Abdeckung zu messen, aber muss von einem zu testenden c-Code alle Funktionsaufrufe mit-loggen. Dieser soll allerdings a) möglichst nicht verändert werden und b) ändert er sich selber ständig, so dass es ziemlich umständlich wäre, den c-code jedesmal zu instrumentieren....)

    Grüße,
    Daniel



  • Ich kenne den Artikel nicht und so ohne weiteres kann ich auch keinen Bezug zu Assembler erkennen. Wenn es um die Frage der Machbarkeit ueber Compilerswitches o.Ae. geht, waere das Thema in "Rund um die Programmierung" oder dem "Compiler- und IDE-Forum" besser aufgehoben.



  • und so ohne weiteres kann ich auch keinen Bezug zu Assembler erkennen.

    sorry, hätte ich vielleicht etwas deutlicher ausdrücken sollen; das ganze war in einem zusätzlichen assembler modul enthalten, das dann zusammen mit dem übersetzten c-code gelinkt wurde und erst nach dem Laden des Programmes auf den (aus dem c-code erstellten) Machinencode "losgegangen" ist....
    Der Compilerswitch war nur ein kleines Hilfsmittel, das in irgendeiner Weise die Codegenerierung beinflusst hat, wodurch es dann erst möglich wurde im geladenen Machinencode die Funktionsaufrufe abzufangen. Das war was ziemlich exotisches, so in der Art, dass der Compiler nach jedem Funktionseintritt zunächst eine zusätzliche Funktion aufruft (oder interrupt auslöst, etc...). In dieser hatte er dann kurz im stack rumgespielt und bekam die Adresse der eigentlich aufgerufenen Funktion. Dann hat er von dieser noch die Rücksprungadresse im stack manipuliert und konnte damit das 'return' ebenfalls abfangen.... (ich weiß das klingt jetzt etwas dumm, aber hab leider echt keine Ahnung mehr wie das genau funktioniert hat, hatte es damals auch nur mal ganz schnell überflogen..... 😞 )

    auf jeden Fall ist die gannze Geschichte auf Maschinencodeebene abgelaufen, daher hatte ich hier gepostet....


Anmelden zum Antworten