Sé que puedo obtener el seguimiento de la pila del hilo actual utilizando backtrace() o [NSThread callStackSymbols], pero ¿cómo puedo obtener el rastro de pila de un hilo DIFERENTE (suponiendo que ha sido congelado)?Imprimir un seguimiento de pila de otro hilo
Respuesta
EDITAR: Mi respuesta original no se imprime desde un hilo arbitrario. desde que he escrito una correcta aplicación en mi proyecto manejador de fallos: https://github.com/kstenerud/KSCrash
En concreto, estos archivos:
- https://github.com/kstenerud/KSCrash/blob/master/KSCrash/KSCrash/Reporting/Tools/KSBacktrace.h
- https://github.com/kstenerud/KSCrash/blob/master/KSCrash/KSCrash/Reporting/Tools/KSBacktrace.c
con la ayuda de:
- https://github.com/kstenerud/KSCrash/blob/master/KSCrash/KSCrash/Reporting/Tools/KSMach.h
- https://github.com/kstenerud/KSCrash/blob/master/KSCrash/KSCrash/Reporting/Tools/KSMach.c
Lo que se hace es:
- hacer una nueva estructura de contexto máquina (_STRUCT_MCONTEXT)
- introducir en su estado de pila usando thread_get_state()
- Consigue el contador de programa (primera entrada de seguimiento de pila) y puntero de marco (todo el resto)
- Atraviesa el marco de pila apuntado por el puntero de marco y almacena todas las instrucciones a cambios en un búfer para su uso posterior.
Tenga en cuenta que debe pausar el hilo antes de hacer esto o puede obtener resultados impredecibles.
El marco de pila está llena de estructuras que contienen dos punteros:
- puntero al siguiente nivel hacia arriba en la pila
- dirección de la instrucción
Así que hay que tener esto en cuenta a la hora caminando por el marco para completar tu rastro de pila. También existe la posibilidad de una pila corrupta, lo que lleva a un puntero malo, que bloqueará su programa. Puede evitar esto copiando memoria usando vm_read_overwrite(), que primero le pregunta al kernel si tiene acceso a la memoria, para que no se cuelgue.
Una vez que tenga el seguimiento de pila, puede simplemente llamar a backtrace() como normal (el controlador de bloqueo debe ser asincrónico para que implemente su propio método de rastreo, pero en casos normales backtrace() está bien) .
Aquí hay una forma más segura de obtener la pila de llamada de otra secuencia: Implementation y some background information. Utiliza el manejo de señal y genera un manejador de señal en el hilo objetivo. También tiene la ventaja de que es más multiplataforma que su solución, es decir, debería funcionar en cualquier lugar donde tenga <signal.h>
y <execinfo.h>
. Para imprimir, puede usar backtrace_symbols
como lo hace en su propia sugerencia. Pero puede que le interese una versión extendida de eso según lo implementado here.Utiliza libbfd (desde binutils; la versión más reciente también funciona principalmente en MacOSX, consulte here para una pequeña limitación que puede no ser relevante para usted) para leer la información de depuración y para agregar el número de línea y otra información (también recae en dladdr
si falla todo lo demás; eso es lo que está haciendo backtrace_symbols
).
- 1. Cómo obtener el seguimiento de la pila de un hilo
- 2. ¿Cómo imprimir el seguimiento completo de pila en la excepción?
- 3. Imprimir la información de seguimiento de la pila de C#
- 4. Imprimir seguimiento de pila en la ventana de salida
- 5. Imprimir el seguimiento de la pila de una excepción
- 6. Imprimir el seguimiento de pila en C++ (MSVC)?
- 7. Error de seguimiento de pila
- 8. Impresión del seguimiento de pila desde un manejador de señal
- 9. ¿Manera fácil de imprimir el seguimiento de pila actual de una aplicación?
- 10. ¿Hay alguna forma de imprimir el seguimiento de pila a pedido?
- 11. Necesito ayuda para descifrar un seguimiento de la pila C#
- 12. Página de error: cómo imprimir el seguimiento de pila en JSP
- 13. cómo imprimir seguimiento de la pila en el archivo de registro
- 14. Encontrar el seguimiento de la pila real de Java desde un seguimiento de la pila de JavaScript
- 15. Obtención de un seguimiento de pila de SBT con Scala
- 16. cómo ejecutar un hilo después de completar otro hilo
- 17. ¿Cómo puedo matar un hilo de otro hilo en Java?
- 18. Actualizar un ObservableCollection de otro hilo
- 19. Obtener un rastreo de otro hilo
- 20. forja de un seguimiento de la pila en Java
- 21. Cómo salida de un seguimiento de pila profunda en Node.js?
- 22. Excepción sin seguimiento de pila en Java
- 23. ¿Cómo puedo imprimir el seguimiento completo de la pila con GlassFish?
- 24. Objective-C Seguimiento de la pila
- 25. Hilo de reposo de otro
- 26. programación C# obtener Seguimiento de la pila
- 27. ¿Cómo puedo imprimir el seguimiento de la pila en tiempo de ejecución de un proceso de Ruby 1.9?
- 28. ¿Cómo puedo escribir un seguimiento de pila de excepción en Erlang después de atraparlo?
- 29. Cómo imprimir la traza de pila de StackOverflowException
- 30. Seguimiento de la creación y duración del hilo Java
Tenga en cuenta que debe suspender el hilo mientras lee su pila. – Albert
Además, ¿estás seguro de que esto funciona? Utiliza '__builtin_frame_address', que siempre trata sobre el hilo ** actual **. – Albert
Resulta que esto realmente no funciona (imprime un seguimiento de la pila, pero no me di cuenta de que estaba imprimiendo desde el hilo actual). Tengo un código nuevo que funciona según lo previsto, pero aún no está listo para su lanzamiento. Publicaré una actualización una vez que esté lista. – Karl