summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-02-05 00:56:00 +0100
committerAndreas Kling <kling@serenityos.org>2021-02-05 00:56:00 +0100
commit5bb35da7848d88fd4b2f04ddab9ac9548d2cd273 (patch)
tree3b212b5496729bb94b443f5c71dd040d8e6132d8
parenta8837843766289c5afd9460c9a3e2b469e8d0e50 (diff)
downloadserenity-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.cpp34
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;