Comment mapper un nom de fonction et un numéro de ligne par une adresse mémoire en langage C?

Comment pouvez-vous associer le nom de la fonction et le numéro de ligne avec une adresse mémoire dans GCC?

c’est à dire en supposant un prototype en langage C:

void func() { // Get the address of caller , maybe this could be avoided MemoryAddress = get_call_address(); // Which line from source code is executing , which calls func() LineNumber = get_lineno_from_symbol ( &MemoryAddress ); // Grab the name who calls func() FunctionName = get_func_from_symbol ( &MemoryAddress ); } 

Y a-t-il des API existantes fournies par GCC ou autre qui peuvent répondre à mes exigences?

Merci beaucoup pour toute réponse de votre part ;-P

Si vous incluez l’en-tête

 #include  

vous pouvez ensuite utiliser la fonction backtrace() pour déterminer l’adresse de la ligne appelante et backtrace_symbols() pour récupérer les noms des fonctions. Cependant, cela ne vous donnera pas les numéros de ligne (bien que cela puisse donner assez d’informations pour aider au débogage, si c’est ce dont vous avez besoin).

Si vous avez absolument besoin de numéros de ligne, vous devrez alors:

  • Assurez-vous que votre programme (et toutes ses bibliothèques) sont compilés avec le débogage activé (indicateur -g à gcc)
  • Utilisez le programme addr2line pour traduire les adresses (extraites de backtrace() ) en références de numéro de fichier / ligne. Vous pouvez appeler cela depuis votre programme en utilisant system() , par exemple. Il enverra la sortie à stdout, mais vous pouvez utiliser une redirection ou un tuyau pour capturer la sortie si nécessaire.

Avec gcc, vous pouvez le faire en utilisant la fonctionnalité de trace .