2010-08-06 3 views
2

J'ai besoin de déboguer un programme sous Linux avec Eclipse (gdb). Le programme s'exécute en tant que root et est assez grand. Le binaire avec les symboles de débogage est d'environ 250 Mo et a plus de 60 threads en cours d'exécution après le démarrage.Comment déboguer un programme qui doit être exécuté en tant que root à partir de gdb (Eclipse) en tant qu'utilisateur (set gdb suid root?)

Je pense à la meilleure solution:

  1. Utilisez gdbserver
  2. d'Eclipse en tant que root
  3. Set gdb suid

Je pense que le numéro 1 (gdbserver) serait la meilleure solution, malheureusement, il ne fonctionne pas fiable. La connexion entre gdb et gdbserver est perdue. Je pense qu'il y a un problème avec l'énorme quantité de données transférées entre eclipse < -> gdb < -> gdbserver. Le numéro 2 (exécuter eclipse en tant que root) signifie exécuter chaque processus en tant que root et interférer ainsi avec le système de contrôle de version, car le plugin Eclipse utiliserait l'utilisateur root à la place du mien pour modifier les fichiers contrôlés par version.

Je n'ai pas essayé le numéro 3 (suid gdb). Qu'est-ce que tu en penses? Est-ce que ça marche? Je suis conscient qu'un gdb racine suid est aussi sûr que de ne pas avoir de mot de passe root, mais la machine est utilisée uniquement pour le développement et le débogage. Et bien sûr, il pourrait y avoir un script "activer/désactiver" qui ne définit le bit suid que lorsque cela est nécessaire.

Avez-vous d'autres suggestions?

+1

double possible de [comment déboguer l'application en tant que root dans Eclipse dans Ubuntu?] (https: // stackoverflow.com/questions/2891356/how-to-debug-application-as-root-in-eclipse-in-ubuntu) – byeo

Répondre

1

Soit 1) ou 3) sonnent comme des solutions fines.

La quantité de trafic gdb < -> gdbserver n'est jamais très importante. Connexion perdue implique que vous n'utilisez pas le protocole de transport fiable (le protocole de connexion sont vous utilisez? avez-vous essayé socket local?), ou un bug dans votre version de gdb/gdbserver (quelle version est-il?)

Vous peut également envisager 4: changer le programme à pas nécessitent des autorisations root en premier lieu. Tout grand programme aura des bugs. Bugs + suid-root => machine OWND. Vraisemblablement, vous enverrez ce programme à vos clients. Si elles souffrent de la machine OWND, elles peuvent vous poursuivre pour des dommages.

Habituellement, il n'y a qu'un très petit ensemble d'opérations qui nécessitent vraiment des permissions root, et de telles opérations (si elles sont suffisamment rares) sont mieux exécutées par un "binaire auxiliaire" (qui est suid-root, mais qui ne fonctionne pas tout le temps, et est petit => moins susceptible d'avoir des bugs).

+0

Le terme "connexion perdue" n'était pas correct, il ressemble plus à un problème de synchronisation. Il y a des erreurs étranges dans le protocole gdbserver. – IanH

1

Le moins intrusif (pas besoin de salir avec suid) est de vous configurer pour exécuter gdb en tant que root dans/etc/sudoers puis exécutez simplement:

sudo xauth merge ~/.Xauthority

sudo gdb

où la première commande est nécessaire pour permettre la racine connexion ouverte au serveur X

Questions connexes