3 votes

Pourquoi "gdb" imprime-t-il les méthodes de classes spécifiques ?

Le contexte

J'ai récemment trouvé cette question car je cherchais un moyen de lister toutes les méthodes disponibles dans une classe, j'ai donc commencé à expérimenter avec la méthode ptype ce qui m'a amené à poser cette question

Considérons le fichier suivant

#include <array>
#include <vector>
#include <list>

int main() {
  std::array <int, 1> a;
  std::vector <int> v;
  std::list <int> l;

  return 0;
}

Je peux dresser la liste de toutes les méthodes présentes dans le array en procédant comme suit

g++ -g main.cpp && \
  gdb -q -batch -ex 'break 10' -ex 'run' -ex 'ptype a' ./a.out

Breakpoint 1 at 0x1179: file main.cpp, line 10.

Breakpoint 1, main () at main.cpp:10
10    return 0;
type = struct std::array<int, 1> [with _Tp = int] {
    std::__array_traits<_Tp, 1>::_Type _M_elems;
  public:
    void fill(reference);
    void swap(std::array<_Tp, 1> &);
    iterator begin(void);
    iterator begin(void) const;
    iterator end(void);
(... more methods ...)

Cependant, cela ne se produit pas avec le vector y list (voir ci-dessous).

Exécution ptype sur une instance du vector classe

g++ -g main.cpp && \
  gdb -q -batch -ex 'break 10' -ex 'run' -ex 'ptype v' ./a.out

Breakpoint 1 at 0x1179: file main.cpp, line 10.

Breakpoint 1, main () at main.cpp:10
10    return 0;
type = std::vector<int>

Exécution ptype sur une instance du list classe

g++ -g main.cpp && \
  gdb -q -batch -ex 'break 10' -ex 'run' -ex 'ptype l' ./a.out

Breakpoint 1 at 0x1179: file main.cpp, line 10.

Breakpoint 1, main () at main.cpp:10
10    return 0;
type = std::list<int>

La question

¿Por qué ptype imprime toutes les méthodes présentes dans le array mais ne fait pas de même avec la classe vector y list classes ?

0voto

ks1322 Points 9238

Je pense qu'il s'agit d'un bug de gdb. J'ai reproduit ce comportement pour std::vector sur ma boîte, ptype v n'émet pas de std::vector les membres :

(gdb) ptype v
type = std::vector<int>

D'autre part ptype/r v ne produit pas de membres :

(gdb) ptype/r v
type = class std::vector<int, std::allocator<int> > : protected std::_Vector_base<int, std::allocator<int> > {
  private:
    static bool _S_nothrow_relocate(std::true_type);
    static bool _S_nothrow_relocate(std::false_type);
    static bool _S_use_relocate(void);
    ...

ptype/r ne devrait afficher les membres que sous une forme brute plus verbeuse que la forme ordinaire. ptype voir dans la documentation :

Affichage sous forme "brute". Normalement, GDB substitue les paramètres de modèle et les typedefs définis dans une classe lors de l'impression des membres de la classe. de la classe. L'option /r désactive cette substitution.

Mais l'ordinaire ptype n'affiche rien. En guise de solution de contournement, vous pouvez essayer d'utiliser ptype/r .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X