2009-01-24 4 views
17

et je voudrais savoir s'il est possible d'arrêter un programme quand on utilise une fonction d'un certain fichier. Idéalement ce que je cherche quelque chose comme:En utilisant gdb arrêter le programme quand il utilise une fonction du fichier X

GDB Stop when use a function from file foo.cpp 

La raison de le faire parce que je suis le débogage d'un code qui est pas à moi et je ne sais pas exactement quelles fonctions sont été appelés et quelles fonctions ne sont pas. Y a-t-il une fonction dans GDB pour faire ce que je cherche, ou n'importe quelle autre manière recommandée de faire quelque chose de similaire?

Merci

+0

Acceptez s'il vous plaît: http://stackoverflow.com/a/478145/895245, il fait exactement ce que vous voulez dans GDB actuel. –

Répondre

21

Étape 1: construire une liste de toutes les fonctions définies dans foo.cpp
Le je peux penser moyen le plus simple de (en supposant que vous avez binutils et GNU grep):

nm a.out | grep ' T ' | addr2line -fe a.out | 
    grep -B1 'foo\.cpp' | grep -v 'foo\.cpp' > funclist 

Étape 2: construire un script GDB qui fixera un point d'arrêt sur chacune des fonctions ci-dessus:

sed 's/^/break /' funclist > stop-in-foo.gdb 

[de toute évidence, les étapes 1 et 2 peuvent être combinées; -]

Étape 3: En fait, définir les points d'arrêt:

gdb a.out 
(gdb) source stop-in-foo.gdb 

Regarder this réponse, une encore plus simple (si vous êtes sur Fedora Linux) façon de découvrir les fonctions de foo.cpp sont appelés:

ftrace -sym='foo.cpp#*' ./a.out 

Dommage que la page de manuel ftrace indique que cela n'est pas encore implémenté.

+0

J'allais dire de le faire, mais +1 pour le faire réellement. =) –

+1

Ne semble pas détecter les fonctions statiques. –

0

points d'arrêt gdb ont quelques syntaxe ... See here.

Il ne se cassera pas sur une fonction dans le fichier si ....

Edit: Vous pouvez faire quelque chose stupide comme faire toutes les fonctions appeler une fonction factice void foo (void), et point d'arrêt à l'intérieur. Au moins, vous casseriez dans le fichier, et devrait être trivial pour trouver quelle fonction du côté du fichier X est appelée.

+0

Ce n'est pas une mauvaise idée de la fonction foo, la chose est que j'ai beaucoup de méthodes et de fichiers, la seule option que je peux peut-être utiliser est regex rbreak. Merci – Eduardo

2

la réponse occupée russe semble très bonne, mais puisque vous dites:

Je ne sais pas exactement quelles fonctions sont été appelés et quelles fonctions sont pas.

Est-ce un rapport dont les fonctions sont touchées, généré par un outil de couverture de code tel que gcov ou quelque chose impliquant Valgrind être une bonne solution à votre problème?

1

Vous pouvez utiliser la commande:

break foo.cpp:function-name 
+0

Cela va seulement casser une fonction, mais la question est pour toutes les fonctions. – Herbert

+0

'rbreak foo.cpp: .' va interrompre toutes les fonctions de' foo.cpp' qui correspondent à regex '.' (c'est-à-dire toutes les fonctions de' foo.cpp'). – ShreevatsaR

10

rbreak regex

points d'arrêt sur toutes les fonctions correspondant à l'expression rationnelle d'expression régulière.Cette commande définit un point d'arrêt inconditionnel sur toutes les correspondances, en imprimant une liste de tous les points d'arrêt définis. Une fois ces points d'arrêt définis, ils sont traités comme les points d'arrêt définis avec la commande break. Vous pouvez les supprimer, les désactiver ou les rendre conditionnels de la même manière que n'importe quel autre point d'arrêt.

La syntaxe de l'expression régulière est la syntaxe standard utilisée avec des outils comme `grep '. Notez que ceci est différent de la syntaxe utilisée par les shells, donc par exemple foo * correspond à toutes les fonctions qui incluent un fo suivi de zéro ou plus os. Il y a un *. Implicite et suiveur de l'expression régulière que vous fournissez, donc pour correspondre seulement aux fonctions qui commencent par foo, utilisez^foo. Lors du débogage des programmes C++, rbreak est utile pour définir des points d'arrêt sur des fonctions surchargées qui ne sont pas membres d'une classe spéciale.

+1

Cela semble être mieux que la réponse acceptée à moi :) – kizzx2

+0

Cela m'a énormément aidé! Bien que je suppose qu'il ne peut pas être la réponse acceptée car il correspond aux noms de fonctions et non le nom de fichier du fichier dans lequel il réside. –

1

rbreak foo.cpp:.

Ici . correspond à quoi que ce soit, et donc des pauses toutes les fonctions de fichier foo.cpp.

Questions connexes