mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-08 19:08:14 +00:00
astfd: Adds a timestamp for each entry.
Now with menuselect "DEBUG_FD_LEAKS" and CLI "core show fd", a timestamp is shown with each file descriptor. This helps to debug leaked UDP/TCP ports on long-lived servers, for example. ASTERISK-25405 #close Change-Id: I968339e5155a512eba1032a5263f1ec8b5e1f80b
This commit is contained in:
13
main/astfd.c
13
main/astfd.c
@@ -46,6 +46,8 @@ ASTERISK_REGISTER_FILE()
|
|||||||
#include "asterisk/lock.h"
|
#include "asterisk/lock.h"
|
||||||
#include "asterisk/strings.h"
|
#include "asterisk/strings.h"
|
||||||
#include "asterisk/unaligned.h"
|
#include "asterisk/unaligned.h"
|
||||||
|
#include "asterisk/localtime.h"
|
||||||
|
#include "asterisk/time.h"
|
||||||
|
|
||||||
static struct fdleaks {
|
static struct fdleaks {
|
||||||
const char *callname;
|
const char *callname;
|
||||||
@@ -54,6 +56,7 @@ static struct fdleaks {
|
|||||||
char file[40];
|
char file[40];
|
||||||
char function[25];
|
char function[25];
|
||||||
char callargs[60];
|
char callargs[60];
|
||||||
|
struct timeval now;
|
||||||
} fdleaks[1024] = { { "", }, };
|
} fdleaks[1024] = { { "", }, };
|
||||||
|
|
||||||
/* COPY does ast_copy_string(dst, src, sizeof(dst)), except:
|
/* COPY does ast_copy_string(dst, src, sizeof(dst)), except:
|
||||||
@@ -79,6 +82,7 @@ static struct fdleaks {
|
|||||||
#define STORE_COMMON(offset, name, ...) \
|
#define STORE_COMMON(offset, name, ...) \
|
||||||
do { \
|
do { \
|
||||||
struct fdleaks *tmp = &fdleaks[offset]; \
|
struct fdleaks *tmp = &fdleaks[offset]; \
|
||||||
|
tmp->now = ast_tvnow(); \
|
||||||
COPY(tmp->file, file); \
|
COPY(tmp->file, file); \
|
||||||
tmp->line = line; \
|
tmp->line = line; \
|
||||||
COPY(tmp->function, func); \
|
COPY(tmp->function, func); \
|
||||||
@@ -271,7 +275,7 @@ static char *handle_show_fd(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
|
|||||||
case CLI_GENERATE:
|
case CLI_GENERATE:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
getrlimit(RLIMIT_FSIZE, &rl);
|
getrlimit(RLIMIT_NOFILE, &rl);
|
||||||
if (rl.rlim_cur == RLIM_INFINITY || rl.rlim_max == RLIM_INFINITY) {
|
if (rl.rlim_cur == RLIM_INFINITY || rl.rlim_max == RLIM_INFINITY) {
|
||||||
ast_copy_string(line, "unlimited", sizeof(line));
|
ast_copy_string(line, "unlimited", sizeof(line));
|
||||||
} else {
|
} else {
|
||||||
@@ -280,8 +284,13 @@ static char *handle_show_fd(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
|
|||||||
ast_cli(a->fd, "Current maxfiles: %s\n", line);
|
ast_cli(a->fd, "Current maxfiles: %s\n", line);
|
||||||
for (i = 0; i < ARRAY_LEN(fdleaks); i++) {
|
for (i = 0; i < ARRAY_LEN(fdleaks); i++) {
|
||||||
if (fdleaks[i].isopen) {
|
if (fdleaks[i].isopen) {
|
||||||
|
struct ast_tm tm = {0};
|
||||||
|
char datestring[256];
|
||||||
|
|
||||||
|
ast_localtime(&fdleaks[i].now, &tm, NULL);
|
||||||
|
ast_strftime(datestring, sizeof(datestring), "%F %T", &tm);
|
||||||
snprintf(line, sizeof(line), "%d", fdleaks[i].line);
|
snprintf(line, sizeof(line), "%d", fdleaks[i].line);
|
||||||
ast_cli(a->fd, "%5d %15s:%-7.7s (%-25s): %s(%s)\n", i, fdleaks[i].file, line, fdleaks[i].function, fdleaks[i].callname, fdleaks[i].callargs);
|
ast_cli(a->fd, "%5d [%s] %22s:%-7.7s (%-25s): %s(%s)\n", i, datestring, fdleaks[i].file, line, fdleaks[i].function, fdleaks[i].callname, fdleaks[i].callargs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return CLI_SUCCESS;
|
return CLI_SUCCESS;
|
||||||
|
|||||||
Reference in New Issue
Block a user