diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2017-11-10 20:51:45 +0100 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2017-11-10 20:51:45 +0100 |
commit | 4516416d3d0263891896488d2831f2dc4bdf79ee (patch) | |
tree | a32552685e808c4357b8fb2812aaaacd6c6d828a | |
parent | 50c27368522af16b7473e40a890ca9c29d71d63f (diff) |
xmonad.hs update, basic c stacktrace handler module
-rw-r--r-- | btrace.c | 100 | ||||
-rw-r--r-- | configs/xmonad.hs | 21 |
2 files changed, 115 insertions, 6 deletions
diff --git a/btrace.c b/btrace.c new file mode 100644 index 0000000..e9ade89 --- /dev/null +++ b/btrace.c @@ -0,0 +1,100 @@ +#include <execinfo.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/wait.h> + +#define STACKTRACES 10 + + +static char *exec_path = NULL; + + +void bt_set_arg0(const char *arg0) { + if (!exec_path && arg0) { + exec_path = strdup(arg0); + } +} + +static void addr_to_array(char **strings, size_t siz, char **result) { + char *start, *end; + + for (size_t i = 0; i < siz; ++i) { + start = strchr(strings[i], '+'); + if (start) { + end = strchr(start, ')'); + start++; + if (end) + result[i] = strndup(start, end-start); + else + result[i] = strdup(""); + } + } +} + +void bt_print_trace (void) { + void *array[STACKTRACES]; + size_t bt_size; + char **strings; + size_t i; + char **addrs; + + bt_size = backtrace(array, STACKTRACES); + strings = backtrace_symbols(array, bt_size); + + printf("\n\n[1] Obtained %zd stack frames.\n", bt_size); + for (i = 0; i < bt_size; ++i) + printf("%s\n", strings[i]); + + /* addr2line -p -e ./btrace -f -i [addresses] */ + if (exec_path) { + addrs = (char**) calloc(bt_size, sizeof(*addrs)); + + addr_to_array(strings, bt_size, addrs); + printf("\n\n[2] Run for more info: addr2line -p -e %s -f -i", exec_path); + for (i = 0; i < bt_size; ++i) { + printf(" %s", addrs[i]); + } + printf("%s\n", ""); + + for (i = 0; i < bt_size; ++i) + if (addrs[i]) + free(addrs[i]); + free(addrs); + } + + free(strings); +} + +void bt_sighandler(int signum) { + bt_print_trace(); + switch (signum) { + case SIGTERM: + case SIGABRT: + case SIGSEGV: + exit(1); + } +} + + + + +/* A dummy function to make the backtrace more interesting. */ +void dummy_function(void) { + bt_print_trace(); +} + +#include <assert.h> +int main(int argc, char **argv) { + bt_set_arg0(argv[0]); + dummy_function(); + signal(SIGTERM, bt_sighandler); + signal(SIGABRT, bt_sighandler); + signal(SIGSEGV, bt_sighandler); + + //assert(0); + *(int*)(NULL) = 0; + return 0; +} diff --git a/configs/xmonad.hs b/configs/xmonad.hs index 119072e..7ee196b 100644 --- a/configs/xmonad.hs +++ b/configs/xmonad.hs @@ -9,6 +9,7 @@ import XMonad.Hooks.DynamicLog import XMonad.Hooks.ManageDocks import XMonad.Hooks.ManageHelpers import XMonad.Hooks.SetWMName +import XMonad.Hooks.EwmhDesktops import XMonad.Hooks.UrgencyHook import XMonad.Layout.NoBorders import XMonad.Layout.Tabbed @@ -22,6 +23,7 @@ import XMonad.Actions.CycleWS import XMonad.Util.Replace import XMonad.Util.Run import XMonad.Util.EZConfig(additionalKeys) +import XMonad.Util.NamedScratchpad import qualified XMonad.StackSet as W import qualified Data.Map as M @@ -38,10 +40,11 @@ myTerminal = "x-terminal-emulator" -- The default number of workspaces (virtual screens) and their names. -- comWS = "1:com" -fileWS = "2:file" +fileWS = "2:mail" webWS = "3:web" w1WS = "4:work1" w2WS = "5:work2" +W3WS = "6:work3" myWorkspaces :: [WorkspaceId] myWorkspaces = [ comWS, fileWS, webWS, w1WS, w2WS ] ++ map show [6..9] @@ -64,6 +67,8 @@ myManageHook = composeAll [ className =? "Seahorse" --> doShift webWS , className =? "Iceweasel" --> doShift webWS , className =? "chromium" --> doShift webWS + , className =? "Chromium" --> doShift webWS + , resource =? "browser" --> doShift webWS , className =? "chromium-browser" --> doShift webWS , className =? "Chromium-browser" --> doShift webWS , className =? "Icedove" --> doShift webWS @@ -83,6 +88,10 @@ myManageHook = composeAll , className =? "MPlayer" --> doFloat , className =? "VirtualBox" --> doShift w1WS , className =? "Xchat" --> doShift w2WS + , className =? "claws-mail" --> doShift fileWS + , className =? "Claws-mail" --> doShift fileWS + , className =? "notes" --> nonFloating + , className =? "xmobar" --> doIgnore , isFullscreen --> (doF W.focusDown <+> doFullFloat)] @@ -265,6 +274,10 @@ myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ , ((modMask, xK_l), sendMessage Expand) + -- ToggleStruts + , ((modMask, xK_b), + sendMessage ToggleStruts) + -- Push window back into tiling. , ((modMask, xK_t), withFocused $ windows . W.sink) @@ -275,10 +288,6 @@ myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ -- Quit xmonad. , ((modMask .|. shiftMask, xK_q), spawn "/sbin/start-stop-daemon -S -b --exec /usr/bin/killall -- -TERM -u `id -nu`") - - -- Restart xmonad. - , ((modMask, xK_q), - restart "xmonad" True) ] ++ @@ -346,7 +355,7 @@ myStartupHook = do safeSpawnProg "seahorse" safeSpawnProg "chromium" safeSpawnProg "pidgin" - safeSpawnProg "qtox" + safeSpawnProg "claws.sh" setWMName "LG3D" nextWS nextWS |