En algunos proyectos que he hecho en C, me ha gustado usar las siguientes macros, que funcionan de manera similar a Perl de advertir y mueren subrutinas:¿Hay un equivalente en C para el módulo Perl's Carp?
#include <stdio.h>
#include <stdlib.h>
#define warn(...) \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, " at %s line %d\n", __FILE__, __LINE__)
#define die(...) \
warn(__VA_ARGS__); \
exit(0xFF)
hace nada existir como la carpa de Perl, croar, clica, y confesar subrutinas desde Carp? Me gustaría tener algo para informar los errores desde la perspectiva de los usuarios.
Si no, sé que hay funciones backtrace() y backtrace_symbols() en glibc que junto con la opción -dinámica gcc pueden proporcionarme una traza inversa de nombres de funciones y direcciones de código. Pero quiero algo un poco mejor; con acceso a nombres de archivo, línea y función en la pila de llamadas como la subrutina de llamada de Perl. con eso podría escribir mi propio libcarp para usar en mis programas c.
EDIT: 2009-10-19
Estoy pensando en la creación de algo que usa GDB cuando esté disponible el nombre base (argv [0]), a continuación, procesa el seguimiento de la pila para producir los diferentes tipos de mensajes que quiero . Debería poder determinar si no estoy en un ejecutable depurable, o en un sistema sin gdb, en cuyo caso, la carpa y el cloqueo se advertirán y se confundirán y confesarán.
Nunca he usado gdb de esta manera antes (solo lo he ejecutado con mi programa al principio, no cuando ya se estaba ejecutando). Pero encontré algunas funciones en glib (g_on_error_stack_trace y stack_trace) que se parece mucho a lo que quiero hacer: bifurca un proceso de gdb con los argumentos nombre base (argv [0]) y la identificación del proceso, luego escribe en su stdin (que ha sido redirigido a una tubería) el comando "backtrace" seguido de un "quit". Luego lee de su resultado y lo analiza de la manera que le gusta. Esto es casi exactamente lo que necesito hacer.
Para aquellos que no están familiarizados con Perl, la carpa y croak hacen lo que el ejemplo advierte y las macros mueren, solo con el archivo y la línea de la persona que llama del submarino actual. cluck y confess hacen lo mismo, solo con un seguimiento de pila completo. (algunos detalles simplificados) – ysth
Documentos en: http://perldoc.perl.org/Carp.html – Ether
Para las macros de multi-declaraciones verdaderas, se recomienda encapsularlas en {...} mientras (0), para hacer utilizar como una declaración de trabajo como se esperaba. – unwind