1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 08:24:58 +00:00
serenity/Userland/Utilities/bt.cpp
Brian Gianforcaro f1c98dc5ea bt: Fix generation of click-able links for source files.
When the default build location was moved from /Build to the new
architecture specific directory, /Build/i686, this code broke.
All file names are now path relative one additional level up.

So continue the hack, and introduce another dummy directory to
make the relative paths resolve correctly.
2021-05-01 08:44:33 +02:00

86 lines
2.2 KiB
C++

/*
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/LexicalPath.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/EventLoop.h>
#include <LibCore/File.h>
#include <LibSymbolClient/Client.h>
int main(int argc, char** argv)
{
if (pledge("stdio rpath unix fattr", nullptr) < 0) {
perror("pledge");
return 1;
}
if (unveil("/proc", "r") < 0) {
perror("unveil");
return 1;
}
if (unveil("/tmp/rpc", "crw") < 0) {
perror("unveil");
return 1;
}
if (unveil("/tmp/portal/symbol", "rw") < 0) {
perror("unveil");
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!
auto symbols = SymbolClient::symbolicate_thread(pid, pid);
for (auto& symbol : symbols) {
out("{:p} ", symbol.address);
if (!symbol.name.is_empty())
out("{} ", symbol.name);
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/dummy/{}", symbol.filename));
if (access(full_path.characters(), F_OK) == 0) {
linked = true;
out("\033]8;;file://{}{}?line_number={}\033\\", hostname, full_path, symbol.line_number);
}
out("\033[34;1m{}:{}\033[0m", LexicalPath(symbol.filename).basename(), symbol.line_number);
if (linked)
out("\033]8;;\033\\");
out(")");
}
outln("");
}
return 0;
}