From d6c67edb1e82f29ed9f16aa1b662b923682129c0 Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Sun, 30 Dec 2018 23:19:52 +0800 Subject: [PATCH] Add coredump feature and print PC --- .../luci/files/luci/i18n/smartdns.zh-cn.po | 6 ++++++ .../luci/model/cbi/smartdns/smartdns.lua | 7 +++++++ package/openwrt/files/etc/init.d/smartdns | 7 ++++++- src/dns_client.c | 2 +- src/smartdns.c | 21 ++++++++++++++++--- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/package/luci/files/luci/i18n/smartdns.zh-cn.po b/package/luci/files/luci/i18n/smartdns.zh-cn.po index 925eb20..9f85244 100644 --- a/package/luci/files/luci/i18n/smartdns.zh-cn.po +++ b/package/luci/files/luci/i18n/smartdns.zh-cn.po @@ -16,6 +16,12 @@ msgstr "SmartDNS是一个本地高性能DNS服务器,支持避免域名污染 msgid "Custom Settings" msgstr "自定义设置" +msgid "Generate Coredump" +msgstr "生成coredump" + +msgid "Generate Coredump file when smartdns crash, coredump file is located at /tmp/smartdns.xxx.core." +msgstr "当smartdns异常时生成coredump文件,coredump文件在/tmp/smartdns.xxx.core." + msgid "Server Name" msgstr "服务器名称" diff --git a/package/luci/files/luci/model/cbi/smartdns/smartdns.lua b/package/luci/files/luci/model/cbi/smartdns/smartdns.lua index dd760a2..3f2ead4 100644 --- a/package/luci/files/luci/model/cbi/smartdns/smartdns.lua +++ b/package/luci/files/luci/model/cbi/smartdns/smartdns.lua @@ -103,6 +103,13 @@ function custom.write(self, section, value) nixio.fs.writefile("/etc/smartdns/custom.conf", value) end +o = s:taboption("custom", Flag, "coredump", translate("Generate Coredump"), translate("Generate Coredump file when smartdns crash, coredump file is located at /tmp/smartdns.xxx.core.")) +o.rmempty = false +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end + -- Upstream servers s = m:section(TypedSection, "server", translate("Upstream Servers"), translate("Upstream Servers, support UDP, TCP protocol. " .. "Please configure multiple DNS servers, including multiple foreign DNS servers.")) diff --git a/package/openwrt/files/etc/init.d/smartdns b/package/openwrt/files/etc/init.d/smartdns index 6354fdb..fad946b 100644 --- a/package/openwrt/files/etc/init.d/smartdns +++ b/package/openwrt/files/etc/init.d/smartdns @@ -174,6 +174,11 @@ start_service() { conf_append "server-name" "$server_name" fi + config_get "coredump" "$section" "coredump" "0" + if [ "$coredump" = "1" ]; then + COREDUMP="1" + fi + config_get "port" "$section" "port" "6053" config_get "ipv6_server" "$section" "ipv6_server" "1" config_get "tcp_server" "$section" "tcp_server" "1" @@ -270,7 +275,7 @@ start_service() { echo "conf-file $BLACKLIST_IP_CONF" >> $SMARTDNS_CONF_TMP echo "conf-file $CUSTOM_CONF" >> $SMARTDNS_CONF_TMP mv $SMARTDNS_CONF_TMP $SMARTDNS_CONF - + if [ "$COREDUMP" = "1" ]; then args="$args -S" ulimit -c unlimited diff --git a/src/dns_client.c b/src/dns_client.c index ff08f7e..a785249 100644 --- a/src/dns_client.c +++ b/src/dns_client.c @@ -927,7 +927,7 @@ static int _dns_client_process_udp(struct dns_server_info *server_info, struct e } } - tlog(TLOG_DEBUG, "recv udp, from %s, ttl: %d", gethost_by_addr(from_host, (struct sockaddr *)&from, from_len), ttl); + tlog(TLOG_DEBUG, "recv udp, from %s, len: %d, ttl: %d", gethost_by_addr(from_host, (struct sockaddr *)&from, from_len), len, ttl); if ((ttl != server_info->ttl) && (server_info->ttl > 0) && (server_info->result_flag & DNSSERVER_FLAG_CHECK_TTL)) { /* tlog(TLOG_DEBUG, "TTL mismatch, from:%d, local %d, discard result", ttl, server_info->ttl); */ diff --git a/src/smartdns.c b/src/smartdns.c index 4f80808..4d00c35 100644 --- a/src/smartdns.c +++ b/src/smartdns.c @@ -39,6 +39,7 @@ #include #include #include +#include #define RESOLVE_FILE "/etc/resolv.conf" #define MAX_LINE_LEN 1024 @@ -297,10 +298,24 @@ void sig_exit(int signo) dns_server_stop(); } -void sig_error_exit(int signo, siginfo_t *siginfo, void *context) +void sig_error_exit(int signo, siginfo_t *siginfo, void *ct) { - tlog(TLOG_ERROR, "process exit with signal %d, code = %d, errno = %d, pid = %d, self = %d, addr = %p\n", signo, siginfo->si_code, siginfo->si_errno, - siginfo->si_pid, getpid(), siginfo->si_addr); + unsigned long PC = 0; + ucontext_t *context = ct; +#if defined(__i386__) + int *pgregs = (int*)(&(context->uc_mcontext.gregs)); + PC = pgregs[REG_EIP]; +#elif defined(__x86_64__) + int *pgregs = (int*)(&(context->uc_mcontext.gregs)); + PC = pgregs[REG_RIP]; +#elif defined(__aarch64__) || defined(__arm__) + PC = context->uc_mcontext.arm_pc; +#elif defined(__mips__) + PC = context->uc_mcontext.pc; +#endif + tlog(TLOG_ERROR, "process exit with signal %d, code = %d, errno = %d, pid = %d, self = %d, pc = %#lx, addr = %#lx\n", signo, siginfo->si_code, siginfo->si_errno, + siginfo->si_pid, getpid(), PC, (unsigned long)siginfo->si_addr); + sleep(1); _exit(0); }