Bonjour,
Sur un code source donné (en l’occurrence le code source du driver realtek r8192), je souhaite retirer tous les appels à la fonction printk().
J'ai d'abord pensé à utiliser sed & co pour supprimer les lignes, l'ennuis, c'est que parfois les appels à la fonction s'étendent sur plusieurs lignes, ce qui complique pas mal les choses.
Je précise que je veux vraiment supprimer les appels, pas juste augmenter la verbosité du message et configurer le gestionnaire de log pour qu'il n'affiche pas au delà d'un certain niveau par défaut.
Je pourrai faire à la main, mais je veux rendre le truc automatisé car c'est pour un PKGBUILD (donc en bash).
J'avais pensé aussi redéfinir la fonction printk à l'aide d'une macro, mais je vois pas trop comment faire ça de manière scriptable.
Ou alors une option à passer au compilateur ? (comme ça il suffirait juste de patcher le Makefile)
Des idées ?
Merci
# plusieurs lignes reelles ou visuelles
Posté par NeoX . Évalué à 1.
c'est que parfois les appels à la fonction s'étendent sur plusieurs lignes, ce qui complique pas mal les choses.
sur plusieurs lignes :
- visuelles (vi saute à la ligne suivante quand tu fait fleche du bas, ou la ligne se rallonge si tu agrandis ta fenetre)
exemple :
void unefonction ( fonction1(), fonction2(arguement1, arguement 2), argumentA, arguementB, arguement C, variableD)
{
le code de ma fonction;
};
- reelles (avec des retours à la ligne dans une seule ligne) : comme par exemple :
void unefonction ( fonction1(),
\ fonction2(arguement1, arguement 2),
\ argumentA,
\ arguementB,
\ arguementC,
\ variableD
)
{
le code de ma fonction;
};
dans le cas 1, tu peux utiliser sed/awk pour trouver et remplacer les printk(xxxxx).
dans le cas 2, il faut juste que le printk(xxxxx) ne soit pas sur plusieurs lignes lui meme
[^] # Re: plusieurs lignes reelles ou visuelles
Posté par anakin . Évalué à 1.
Et je dirai que c'est le cas 2 que j'ai (vrai retour à la ligne).
Exemple :
printk(KERN_DEBUG "%s: Encryption failed: len=%d.\n",
ieee->dev->name, frag->len);
et sous vi, c'est bien 3 lignes différentes.
# pourquoi ?
Posté par solsTiCe (site web personnel) . Évalué à 2.
bin oui pourquoi une macro que tu insères avec sed; c'est pas bien ?
ou même tu peux faire un patch ?
sed -i '/WHERE/a\#define printk ... \' r812.c
non ?
[^] # Re: pourquoi ?
Posté par anakin . Évalué à 1.
Ou alors il faudrait trouver un moyen d'insérer juste avant la déclaration de la première déclaration de fonction...
# And ze winner iz:
Posté par liberforce (site web personnel) . Évalué à 6.
[^] # Re: And ze winner iz:
Posté par anakin . Évalué à 2.
@@ expression E; @@
-printk(E);
Il n'a matché que le code ressemblant à :
printk("====> we can not show so many peers\n");
mais pas :
printk(KERN_WARNING "%s: could not initialize WEP: "
"load module rtllib_crypt_wep\n",
dev->name);
Peut être que expression ne peut pas contenir des retour à la ligne (grammaire http://www.emn.fr/z-info/coccinelle/docs/main_grammar009.htm(...) ?
[^] # Re: And ze winner iz:
Posté par anakin . Évalué à 1.
-printk(...)
apparemment le patch est plus grand...
[^] # Re: And ze winner iz:
Posté par anakin . Évalué à 1.
Du coup j'ai rajouté un coup de sed après pour vraiment tout supprimer...mais je ne comprend pas pourquoi le spatch ne fonctionne pas...
[^] # Re: And ze winner iz:
Posté par totof2000 . Évalué à 2.
[^] # Re: And ze winner iz:
Posté par NeoX . Évalué à 2.
ca dire à ton shell de faire les separations au ; au lieu de le faire aux espaces.
[^] # Re: And ze winner iz:
Posté par anakin . Évalué à 1.
Mais est-ce que ça "résiste" au retour à la ligne ?
[^] # Re: And ze winner iz:
Posté par Kerro . Évalué à 2.
printk(KERN_DEBUG "%s: Encryption failed: len=%d.\n", /* ugly hack ; must be rewritten*/
ieee->dev->name, frag->len);
Pour ce genre de besoin, il faut une sorte de parser C simplifié. Le faire en awk est je pense possible. Sinon flex/bison est vraiment fait pour (bonjour la doc si tu débutes).
Quelle que soit la solution utilisée, il ne faut pas que le code soit compliqué.
Exemple avec erreur à la compilation une fois que c'est passé à la moulinette:
if ( truc() && printk(KERN_DEBUG "%s: Encryption failed: len=%d.\n", ieee->dev->name, frag->len) ) {
blah;
}
/* oui, c'est crade. Mais c'est valide */
Exemple avec bug:
result = printk(KERN_DEBUG "%s: Encryption failed: len=%d.\n", ieee->dev->name, frag->len);
if (result<=0 && errorstop=true) {
blah;
}
[^] # Re: And ze winner iz:
Posté par liberforce (site web personnel) . Évalué à 2.
[^] # Re: And ze winner iz:
Posté par anakin . Évalué à 1.
Au mieux (avec les règles citées au dessus) il ne trouve que 5 printk sur 20...
# Quick and dirty
Posté par Grégory Landais (site web personnel) . Évalué à 4.
gcc -D'printk(a, b, c)=' etc
Ca ajoute une macro printk vide. J'ai testé sur un petit exemple ca semble marcher.
Autre solution : Créer un fichier qui contient la macro et utiliser l'option -include de gcc.
[^] # Re: Quick and dirty
Posté par anakin . Évalué à 1.
[^] # Re: Quick and dirty
Posté par Grégory Landais (site web personnel) . Évalué à 1.
gcc -D'printk(...)=' etc
et ça semble fonctionner.[^] # Re: Quick and dirty
Posté par anakin . Évalué à 1.
Peut être pour les mêmes raisons qui fait que spatch ne marche pas non plus.
[^] # Re: Quick and dirty
Posté par benoar . Évalué à 2.
Par contre, que gcc n'y arrive pas, ce n'est pas normal : comment il pourrait le compiler sinon ?… J'ai essayé avec le code que tu fournis plus haut, la solution de Grégory marche nickel. Tu as un exemple qui ne passe pas ?
[^] # Re: Quick and dirty
Posté par anakin . Évalué à 1.
[^] # Re: Quick and dirty
Posté par benoar . Évalué à 2.
Et pour le tester, je grep simplement "printk" sur le fichier généré ; je ne vois pas en quoi j'ai besoin de le tester en live pour voir si les printk sont bien partis…
[^] # Re: Quick and dirty
Posté par anakin . Évalué à 1.
Mon exemple concret justement c'était qu'au niveau de l'exécution, les printk s'affichaient toujours après avoir rajouté CFLAGS=`echo $CFLAGS`" -D'printk(...)='" dans mon PKGBUILD juste avant le make.
Mais là tu m'expliques tu as un fichier source généré ?
C'est à dire que ta commande
gcc -D'printk(...)='
tu l'exécutes sur du code source et tu obtiens un autre fichier source sur lequel tu fais un grep et qui n'affiche plus les printk ?
Comment utilises-tu ta commande sur le fichier exemple que j'avais donné ?
[^] # Re: Quick and dirty
Posté par benoar . Évalué à 2.
Je ne lance que le préprocesseur :
gcc -E -D'printk(...)='
Et je ne vois aucun printk en sortie.
Ça se trouve, ton problème est plutôt du genre l'option est pas bien passée, ou alors les fichiers sont générés autrement, ou… ?
[^] # Re: Quick and dirty
Posté par anakin . Évalué à 1.
[^] # Re: Quick and dirty
Posté par anakin . Évalué à 1.
Merci
[^] # Re: Quick and dirty
Posté par anakin . Évalué à 1.
[^] # Re: Quick and dirty
Posté par anakin . Évalué à 1.
Mais il faut une carte wifi compatible pour voir si ca marche ou pas (en regardant la sortie /var/log/kernel.log)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.