Je cherche une façon arch-agnostique d'obtenir le pointeur d'instruction (compteur de programme AKA) de la dernière instruction tentée (ou passée) sur laquelle SIGTRAP a été généré, du point de vue d'un traceur ptrace
.Existe-t-il une façon arch-agnostique d'obtenir un pointeur d'instruction sur SIGTRAP?
Une manière dépendante de l'arche est d'utiliser PTRACE_GETREGS
et de sélectionner par ex. EIP
sur i386, x86_64 sur RIP
, PC
sur ARM etc ..
J'ai essayé d'utiliser siginfo.si_addr
ainsi que siginfo.si_ptr
de PTRACE_GETSIGINFO
struct -returned, mais ces valeurs apparaissent complètement faux (4 chiffres hexadécimaux au lieu de 8, et non même semblable à la vraie adresse), donc ils ne semblent pas être ce dont j'ai besoin.
Dans Linux J'ai aussi essayé de faire usage de champ 30 /proc/<pid>/task/<tid>/stat
, que le noyau remplit fs/proc/array.c:do_task_stat()
avec KSTK_EIP(task)
(qui, en dépit d'être nommé x86-centrique, semble définie pour beaucoup d'autres architectures). Mais pour une raison quelconque sur mon ARMv6 Linux 4.9.28+ (Raspbian 8), j'obtiens des zéros pour le compteur de programme et le pointeur de pile.
Donc, y a-t-il une façon indépendante de l'arc de déterminer l'adresse actuelle/suivante définie par POSIX ou au moins disponible sous Linux?
Comment êtes-vous la configuration de votre gestionnaire de signal? [Utilisez-vous 'sigaction()' et définissez l'indicateur 'SA_SIGINFO' dans le membre de structure' sa_flags'?] (Http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html) Si oui, vous peut avoir trouvé un bug. POSIX exige que le membre 'si_addr' fasse référence à l'instruction fautive. Voir http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html#tag_13_43 Vous devriez ajouter plus d'informations, y compris votre code, et les détails du système tels que le matériel et le système d'exploitation exact. –
@AndrewHenle Je démarre un nouveau processus, qui appelle 'ptrace' avec' PTRACE_TRACEME', puis j'attends le premier événement de débogage dans le parent en utilisant 'waidpid'. L'événement est 'SIGTRAP'. Votre lien indique seulement que c'est pour 'SIGILL' et' SIGFPE' que 'si_addr' est l'adresse de l'instruction fautive, mais ne dit rien sur SIGTRAP. – Ruslan