{"id":16760143,"url":"https://github.com/maulingmonkey/libmmkdebugstack","last_synced_at":"2026-04-26T08:35:05.258Z","repository":{"id":66817365,"uuid":"86116428","full_name":"MaulingMonkey/libMmkDebugStack","owner":"MaulingMonkey","description":"A cross-platform library for simple callstack tracing with C89 and C++03 public APIs.","archived":false,"fork":false,"pushed_at":"2017-04-06T00:17:53.000Z","size":133,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-09-22T23:22:26.427Z","etag":null,"topics":["android","callstack","cross-platform","dbghelp","debug","library","native","stack","trace","unwind"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MaulingMonkey.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-24T22:43:50.000Z","updated_at":"2023-09-27T12:33:22.000Z","dependencies_parsed_at":"2023-02-23T14:00:21.585Z","dependency_job_id":null,"html_url":"https://github.com/MaulingMonkey/libMmkDebugStack","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/MaulingMonkey/libMmkDebugStack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaulingMonkey%2FlibMmkDebugStack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaulingMonkey%2FlibMmkDebugStack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaulingMonkey%2FlibMmkDebugStack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaulingMonkey%2FlibMmkDebugStack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MaulingMonkey","download_url":"https://codeload.github.com/MaulingMonkey/libMmkDebugStack/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaulingMonkey%2FlibMmkDebugStack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32290818,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T08:29:33.829Z","status":"ssl_error","status_checked_at":"2026-04-26T08:29:18.366Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","callstack","cross-platform","dbghelp","debug","library","native","stack","trace","unwind"],"created_at":"2024-10-13T04:22:31.732Z","updated_at":"2026-04-26T08:35:05.244Z","avatar_url":"https://github.com/MaulingMonkey.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# libMmkDebugStack\n\nA cross-platform library for simple callstack tracing with C89 and C++03 public APIs.\n\nRequires a C++11 compiler to build.\n\nLicense: [Apache 2.0](LICENSE.txt)\n\n# Possible Use Cases\n- Fancy assertion or logging macros\n- Automatic tracing for bug database submission (JIRA, Sentry.IO, etc.)\n- Stack traces for leaked allocations or refcounting\n\n# Compatability\n\n| Tested OS    | Compiler    | SDK                     | Unwind Impl              | Symbols Impl     |\n| ------------ | ----------- | ----------------------- | ------------------------ | ---------------- |\n| Windows 7    | VS2015 u1   |                         | DbgHelp                  | DbgHelp          |\n| Android 5.0  | GCC 4.9     | nVidia Codeworks 1R4    | libunwind                | Custom elf/dwarf parser |\n| Android 5.0  | Clang 3.6   | Microsoft's Android SDK | __builtin_return_address | Custom elf/dwarf parser |\n| Ubuntu 16.10 | Clang 3.8.1 |                         | None (noop/fallback)     | None             |\n| Ubuntu 16.10 | GCC 6.2.0   |                         | None (noop/fallback)     | None             |\n\nOther C++11 capable platforms/compilers should at least be able to use the Fallback implementation, feel free to file an issue if they don't!\n\n# Example\n\n```cpp\n#include \u003cmmk/debug/stack.h\u003e // mmkDebugStackCurrentThread etc.\n#include \u003cstdio.h\u003e           // printf\n#include \u003cstring.h\u003e\n\n#define NO_INLINE   ZMMK_DEBUG_STACK_NO_INLINE // Note: ZMMK_* isn't part of the public API\n\nconst char* nameOnly(const char* filename) {\n\tif (const char* bs = strrchr(filename, '\\\\')) return bs+1;\n\tif (const char* fs = strrchr(filename, '/'))  return fs+1;\n\treturn filename;\n}\n\n#define TRACE() (void)(printf(\"Trace:\\n\"),   mmk::debug::stackCurrentThread(mmkDebugStackResolveAll, 0, 25, \\\n    [](const mmk::debug::stackFunction\u0026 f) {                                                                \\\n        printf(\"    %s(%d): %s @ %p\\n\", nameOnly(f.file), f.line, f.name, f.address);                       \\\n        return true; /* continue trace */                                                                   \\\n    }, MMK_DEBUG_STACK_HINT()),   printf(\"\\n\\n\\n\"),   0)\n\nNO_INLINE void test_trace() { TRACE(); }\ntemplate \u003c size_t N \u003e struct recursive { NO_INLINE static void test_trace() { recursive\u003cN-1\u003e::test_trace(); } };\ntemplate \u003c\u003e        struct recursive\u003c0\u003e { NO_INLINE static void test_trace() { ::test_trace(); } };\n\nint main()\n{\n\trecursive\u003c10\u003e::test_trace();\n}\n```\n\nResulting `Debug|x86` Console:\n```\nTrace:\n    main.cpp(19): test_trace @ 013B2C76\n    main.cpp(21): recursive\u003c0\u003e::test_trace @ 013B2C03\n    main.cpp(20): recursive\u003c1\u003e::test_trace @ 013B28E3\n    main.cpp(20): recursive\u003c2\u003e::test_trace @ 013B2933\n    main.cpp(20): recursive\u003c3\u003e::test_trace @ 013B2983\n    main.cpp(20): recursive\u003c4\u003e::test_trace @ 013B29D3\n    main.cpp(20): recursive\u003c5\u003e::test_trace @ 013B2A23\n    main.cpp(20): recursive\u003c6\u003e::test_trace @ 013B2A73\n    main.cpp(20): recursive\u003c7\u003e::test_trace @ 013B2AC3\n    main.cpp(20): recursive\u003c8\u003e::test_trace @ 013B2B13\n    main.cpp(20): recursive\u003c9\u003e::test_trace @ 013B2B63\n    main.cpp(20): recursive\u003c10\u003e::test_trace @ 013B2BB3\n    main.cpp(26): main @ 013B2DB3\n    exe_common.inl(74): invoke_main @ 013B6B4E\n    exe_common.inl(264): __scrt_common_main_seh @ 013B699A\n    exe_common.inl(309): __scrt_common_main @ 013B682D\n    exe_main.cpp(17): mainCRTStartup @ 013B6B68\n    \u003cunknown\u003e(0): BaseThreadInitThunk @ 76F3336A\n    \u003cunknown\u003e(0): RtlInitializeExceptionChain @ 77C39902\n    \u003cunknown\u003e(0): RtlInitializeExceptionChain @ 77C398D5\n```\n\nMore examples:\n- mmkDebugStackTest ([c++](mmkDebugStackTest/main.cpp))\n- mmkNvidiaCodeworksTest ([java](mmkNvidiaCodeworksTest/src/com/maulingmonkey/debug/stack/nvidiaCodeworksTest/DisplayStackActivity.java), [c++](mmkNvidiaCodeworksTest/jni/DisplayStackActivity.cpp))\n- mmkAndroidTest ([java](mmkAndroidTest/src/com/mmkAndroidTest/mmkAndroidTest.java), [c++](libMmkAndroidTest/mmkAndroidTest.cpp))\n\n# Installation\n\n## NuGet\nAdd [libMmkDebugStack](https://www.nuget.org/packages/libMmkDebugStack/) to your project via nuget.  Done!\n\n## From Source (on Windows development machine)\n- Clone the repository\n- Use `libMmkDebugStack.sln` to build `libMmkDebugStack.lib` in the configurations/platforms of your choice.\n- Add `HAS_MMK_DEBUG_STACK` to your preprocessor definitions.\n- Add [`libMmkDebugStack\\include\\`](libMmkDebugStack/include/) to your #include paths.\n- Targeting Windows:\n  - Add `build\\native\\lib\\$(PlatformTarget)\\$(PlatformToolset)\\$(Configuration)\\` to your library paths\n  - Add `libMmkDebugStack.lib` and `DbgHelp.lib` to your additional dependencies list.\n- Targeting Android via the nVidia Codeworks for Android 1R4 SDK:\n  - Add `build\\native\\lib\\$(ArchAbi)\\$(ToolchainIdentifier)\\$(Configuration)\\` to your library paths\n  - Add `MmkDebugStack` to your additional dependencies list.\n- Targeting Android via the Microsoft Android SDK:\n  - Add `build\\native\\lib\\$(Platform)\\$(PlatformToolset)\\$(Configuration)\\` to your library paths\n  - Add `-lMmkDebugStack` to your additional dependencies list.\n\n## From Source (on Linux development machine)\n- Clone the repository\n- Run make\n- Add `-DHAS_MMK_DEBUG_STACK` to your `CCFLAGS`\n- Add `-Lbin/$(compiler)-$(arch)-$(build)-$(language)/` to your `LDFLAGS`\n- Add `-lMmkDebugStack` to your `LDFLAGS`\n- Add `bin/$(compiler)-$(arch)-$(build)-$(language)/` to your `LD_LIBRARY_PATH`\n\n# TODO\n- Add option to use separate debugger process for stability / collecting stacks of foreign threads\n- Backport to C++03 for wider compatability\n- Properly port to Linux, OS X, iOS\n- Port to Consoles, Handhelds, etc. (Blocker: Devkit access)\n- Add Windows CDB backend for possible stability improvements, multi-thread stacks, crash dump analysis, etc.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaulingmonkey%2Flibmmkdebugstack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaulingmonkey%2Flibmmkdebugstack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaulingmonkey%2Flibmmkdebugstack/lists"}