diff options
author | Andreas Kling <kling@serenityos.org> | 2021-02-05 00:56:00 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-02-05 00:56:00 +0100 |
commit | 5bb35da7848d88fd4b2f04ddab9ac9548d2cd273 (patch) | |
tree | 3b212b5496729bb94b443f5c71dd040d8e6132d8 | |
parent | a8837843766289c5afd9460c9a3e2b469e8d0e50 (diff) | |
download | serenity-5bb35da7848d88fd4b2f04ddab9ac9548d2cd273.zip |
bt: Hyperlink filenames in backtraces if available :^)
If we can find a matching filename in /usr/src/serenity, let's make the
filenames in backtraces clickable to open that file.
-rw-r--r-- | Userland/Utilities/bt.cpp | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/Userland/Utilities/bt.cpp b/Userland/Utilities/bt.cpp index a87a58f3b7..ea6f7fde7d 100644 --- a/Userland/Utilities/bt.cpp +++ b/Userland/Utilities/bt.cpp @@ -53,16 +53,26 @@ int main(int argc, char** argv) return 1; } + if (unveil("/usr/src", "b") < 0) { + perror("unveil"); + return 1; + } + if (unveil(nullptr, nullptr) < 0) { perror("unveil"); return 1; } + char hostname[256]; + if (gethostname(hostname, sizeof(hostname)) < 0) { + perror("gethostname"); + return 1; + } + Core::ArgsParser args_parser; pid_t pid = 0; args_parser.add_positional_argument(pid, "PID", "pid"); args_parser.parse(argc, argv); - Core::EventLoop loop; // FIXME: Support multiple threads in the same process! @@ -71,8 +81,26 @@ int main(int argc, char** argv) out("{:p} ", symbol.address); if (!symbol.name.is_empty()) out("{} ", symbol.name); - if (!symbol.filename.is_empty()) - out("(\033[34;1m{}\033[0m:{})", LexicalPath(symbol.filename).basename(), symbol.line_number); + if (!symbol.filename.is_empty()) { + bool linked = false; + + out("("); + + // See if we can find the sources in /usr/src + // FIXME: I'm sure this can be improved! + auto full_path = LexicalPath::canonicalized_path(String::formatted("/usr/src/serenity/dummy/{}", symbol.filename)); + if (access(full_path.characters(), F_OK) == 0) { + linked = true; + out("\033]8;;file://{}{}\033\\", hostname, full_path); + } + + out("\033[34;1m{}\033[0m:{}", LexicalPath(symbol.filename).basename(), symbol.line_number); + + if (linked) + out("\033]8;;\033\\"); + + out(")"); + } outln(""); } return 0; |