Lo implementé yo mismo here.
Inicialmente, quería implementar algo similar a here sugerido, es decir, obtener de algún modo el puntero de marco superior de la hebra y desenrollarlo manualmente (la fuente vinculada se deriva de la implementación de Applus backtrace
, por lo que podría ser específica de Apple, pero la idea es genérica).
Sin embargo, para tener esa seguridad (y la fuente de arriba no es e incluso puede romperse), debe suspender el hilo mientras accede a su pila. Busqué diferentes formas de suspender un hilo y encontré this, this y this. Básicamente, no hay una manera realmente buena. El truco común, también used by the Hotspot JAVA VM, es usar señales y enviar una señal personalizada a su hilo a través del pthread_kill.
Así que, como necesitaría tal señal-hack de todos modos, puedo tenerlo un poco más simple y simplemente usar backtrace
dentro del controlador de señal llamado que se ejecuta en el hilo objetivo (como también se sugirió here by sandeep). Esto es básicamente lo que está haciendo mi implementación.
Si también está interesado en imprimir la traza inversa, es decir, obtener alguna información de depuración (nombre de la función, el nombre de archivo de código fuente, fuente de número de línea de código, ...), leer here acerca de un prolongado backtrace_symbols
basado en libbfd. O simplemente vea la fuente here.
Esto no es precisamente lo que estaba buscando, pero esta es una buena idea. Creo que puedo usarlo ¡Gracias! –
@Alexander es esta solución que funciona para usted cuando malloc o llamadas gratuitas son llamadas de pila ..? y ¿puede llamar a backtrace() en este caso desde el controlador de señal? Me estoy rompiendo. – sandeep
Eventualmente, decidí trabajar con libunwind. Esta solución es demasiado complicada para mis circunstancias y decidí abandonarla. De todos modos, publique aquí si lo hace funcionar de alguna manera. –