Forum Astuces.divers Ça marchait, ça marche plus ? strace est ton ami.

Posté par .
Tags : aucun
7
19
nov.
2010
Parfois des logiciels cessent de fonctionner correctement sans raison apparente ou après une montée de version de la distribution. Jusque-là, pas de scoop.
En l'occurrence, OpenShot n'affichait plus les icônes et les onglets après mise à jour vers Ubuntu 10.10.
Pour tenter de comprendre l'origine d'un autre problème (lié à Compiz), j'ai créé un deuxième compte tout neuf.
Et ô surprise, OpenShot s'affiche correctement ! Mais pourquoi donc ?

Voici comment j'ai trouvé l'explication. (Les exemples sont pour OpenShot, mais ça marche pareil pour tout autre logiciel).

Sous le 1er compte, exécuter dans un terminal :
$ strace openshot 2> os.log
Quitter OpenShot immédiatement, sinon le fichier explose.
$ grep "open(" os.log > /tmp/os-user1.log

Sous le 2ème compte, exécuter dans un terminal :
$ strace openshot 2> os.log
$ grep "open(" os.log > /tmp/os-user2.log

Et enfin :
$ diff /tmp/os-* | less
La lecture attentive des différences montre qu'une bibliothèque liée aux thèmes n'est pas la même pour chaque compte. Le bug est dû au thème personnalisé du compte 1 (utilisation des widgets "Inverted").

Et hop!
  • # En lisant les options de strace...

    Posté par (page perso) . Évalué à 10.

    ... c'est encore mieux.
    strace -o log -eopen
    D'autres exemples d'utilisation pratique de strace:
    http://fr.gnomesupport.org/forums/viewtopic.php?id=612
    http://fr.gnomesupport.org/forums/viewtopic.php?pid=2421
  • # et avec SystemTap

    Posté par (page perso) . Évalué à 7.

    On pourrait aussi faire un truc comme ceci :
    $ cat findbadfiles.stp 
    // findbadfiles.stp GOOD_UID BAD_UID
    
    global good
    global bad
    
    probe syscall.open {
            if (execname() == "openshot") {
                    if (uid() == $1) {
                            good[$filename] = 1
                    }
                    if (uid() == $2) {
                            bad[$filename] = 1
                    }
            }
    }
    
    probe end {
            foreach (file in bad) {
                    if (!good[file]) {
                            printf("%s\n", file)
                    }
            }
    }
    Si le bon utilisateur a l'UID 1000 et le mauvais 1001, ça se lance comme ça :
    # stap findbadfiles.stp 1000 1001
    Après tu lances le programme avec le bon utilisateur et le mauvais. Une fois que c'est fait, tu interromps le script SystemTap et il va t'afficher les fichiers qui ont été ouvert dans le cas qui a merdé mais pas dans l'autre. J'ai absolument pas testé.

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.