genode/repos/os/include/monitor/output.h
Norman Feske 6a57683e52 New debug monitor
The new monitor component at os/src/monitor is the designated successor
of the gdb_monitor. This initial version, however, implements only the
subset needed to inspect the memory of the monitored component(s).

In contrast to the gdb_monitor, the new component supports the monitoring
of multiple components, leveraging the sandbox API. It can therefore be
used as a drop-in replacement for the init component. Like the gdb_monitor,
the new monitor speaks the GDB protocol over Genode's terminal session.
But the protocol implementation does not re-use any gdbserver code,
sidestepping the complexities of POSIX.

There exist two run scripts illustrating the new component. The
os/run/monitor.run script exercises memory inspection via the 'm' command
by letting a test program monitor itself. The os/run/monitor_gdb.run
script allows for the interactive use of GDB to interact with monitored
components.

Issue #4917
2023-06-16 11:24:26 +02:00

62 lines
1.1 KiB
C++

/*
* \brief Output utilities
* \author Norman Feske
* \date 2023-06-06
*/
/*
* Copyright (C) 2023 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _MONITOR__OUTPUT_H_
#define _MONITOR__OUTPUT_H_
#include <base/output.h>
namespace Genode {
struct Gdb_hex;
struct Gdb_checksummed_output;
}
struct Genode::Gdb_hex : Hex
{
template <typename T>
explicit Gdb_hex(T value) : Hex(value, OMIT_PREFIX, PAD) { }
};
struct Genode::Gdb_checksummed_output : Output
{
Output &_output;
uint8_t _accumulated = 0;
Gdb_checksummed_output(Output &output) : _output(output)
{
print(_output, "$");
}
~Gdb_checksummed_output()
{
print(_output, "#", Gdb_hex(_accumulated));
}
void out_char(char c) override { out_string(&c, 1); }
void out_string(char const *str, size_t n) override
{
n = (n == ~0UL) ? strlen(str) : n;
for (unsigned i = 0; i < n; i++)
_accumulated = uint8_t(_accumulated + str[i]);
_output.out_string(str, n);
}
};
#endif /* _MONITOR__OUTPUT_H_ */