-
Notifications
You must be signed in to change notification settings - Fork 14.2k
Reapply "[LLDB][ELF Core] Support all the Generic (Negative) SI Codes." #141670
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…." (llvm#141645) This reverts commit 9d33b92.
@JDevlieghere Is there a way to trigger GreenDragon/Mac CI for this? |
@llvm/pr-subscribers-lldb Author: Jacob Lalonde (Jlalond) ChangesAfter some debugging, I found out ProcessELFCore never updates the platform. I've updated ProcessElfCore to set the arch and platform before we parse the Notes. Patch is 39.84 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/141670.diff 10 Files Affected:
diff --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h
index a702abb540fd9..35ffdabf907e7 100644
--- a/lldb/include/lldb/Target/Platform.h
+++ b/lldb/include/lldb/Target/Platform.h
@@ -21,6 +21,7 @@
#include "lldb/Core/UserSettingsController.h"
#include "lldb/Host/File.h"
#include "lldb/Interpreter/Options.h"
+#include "lldb/Target/StopInfo.h"
#include "lldb/Utility/ArchSpec.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/Utility/FileSpec.h"
@@ -960,6 +961,8 @@ class Platform : public PluginInterface {
virtual CompilerType GetSiginfoType(const llvm::Triple &triple);
+ virtual lldb::StopInfoSP GetStopInfoFromSiginfo(Thread &thread) { return {}; }
+
virtual Args GetExtraStartupCommands();
typedef std::function<Status(const ModuleSpec &module_spec,
diff --git a/lldb/include/lldb/Target/UnixSignals.h b/lldb/include/lldb/Target/UnixSignals.h
index b3605ccefddbe..a1807d69f329b 100644
--- a/lldb/include/lldb/Target/UnixSignals.h
+++ b/lldb/include/lldb/Target/UnixSignals.h
@@ -36,7 +36,9 @@ class UnixSignals {
std::optional<int32_t> code = std::nullopt,
std::optional<lldb::addr_t> addr = std::nullopt,
std::optional<lldb::addr_t> lower = std::nullopt,
- std::optional<lldb::addr_t> upper = std::nullopt) const;
+ std::optional<lldb::addr_t> upper = std::nullopt,
+ std::optional<uint32_t> pid = std::nullopt,
+ std::optional<uint32_t> uid = std::nullopt) const;
bool SignalIsValid(int32_t signo) const;
@@ -105,7 +107,7 @@ class UnixSignals {
llvm::StringRef description,
llvm::StringRef alias = llvm::StringRef());
- enum SignalCodePrintOption { None, Address, Bounds };
+ enum SignalCodePrintOption { None, Address, Bounds, Sender };
// Instead of calling this directly, use a ADD_SIGCODE macro to get compile
// time checks when on the native platform.
diff --git a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp
index 9db2c83acc125..cb60caf1cb422 100644
--- a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp
+++ b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp
@@ -14,6 +14,7 @@
#include <sys/utsname.h>
#endif
+#include "Plugins/Process/Utility/LinuxSignals.h"
#include "Utility/ARM64_DWARF_Registers.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/PluginManager.h"
@@ -480,3 +481,107 @@ CompilerType PlatformLinux::GetSiginfoType(const llvm::Triple &triple) {
ast->CompleteTagDeclarationDefinition(siginfo_type);
return siginfo_type;
}
+
+static std::string GetDescriptionFromSiginfo(lldb::ValueObjectSP siginfo_sp) {
+ if (!siginfo_sp)
+ return "";
+
+ lldb_private::LinuxSignals linux_signals;
+ int code = siginfo_sp->GetChildMemberWithName("si_code")->GetValueAsSigned(0);
+ int signo =
+ siginfo_sp->GetChildMemberWithName("si_signo")->GetValueAsSigned(-1);
+
+ auto sifields = siginfo_sp->GetChildMemberWithName("_sifields");
+ if (!sifields)
+ return linux_signals.GetSignalDescription(signo, code);
+
+ // declare everything that we can populate later.
+ std::optional<lldb::addr_t> addr;
+ std::optional<lldb::addr_t> upper;
+ std::optional<lldb::addr_t> lower;
+ std::optional<uint32_t> pid;
+ std::optional<uint32_t> uid;
+
+ // The negative si_codes are special and mean this signal was sent from user
+ // space not the kernel. These take precedence because they break some of the
+ // invariants around kernel sent signals. Such as SIGSEGV won't have an
+ // address.
+ if (code < 0) {
+ auto sikill = sifields->GetChildMemberWithName("_kill");
+ if (sikill) {
+ auto pid_sp = sikill->GetChildMemberWithName("si_pid");
+ if (pid_sp)
+ pid = pid_sp->GetValueAsUnsigned(-1);
+ auto uid_sp = sikill->GetChildMemberWithName("si_uid");
+ if (uid_sp)
+ uid = uid_sp->GetValueAsUnsigned(-1);
+ }
+ } else {
+
+ switch (signo) {
+ case SIGILL:
+ case SIGFPE:
+ case SIGBUS: {
+ auto sigfault = sifields->GetChildMemberWithName("_sigfault");
+ if (!sigfault)
+ break;
+
+ auto addr_sp = sigfault->GetChildMemberWithName("si_addr");
+ if (addr_sp)
+ addr = addr_sp->GetValueAsUnsigned(-1);
+ break;
+ }
+ case SIGSEGV: {
+ auto sigfault = sifields->GetChildMemberWithName("_sigfault");
+ if (!sigfault)
+ break;
+
+ auto addr_sp = sigfault->GetChildMemberWithName("si_addr");
+ if (addr_sp)
+ addr = addr_sp->GetValueAsUnsigned(-1);
+
+ auto bounds_sp = sigfault->GetChildMemberWithName("_bounds");
+ if (!bounds_sp)
+ break;
+
+ auto addr_bnds_sp = bounds_sp->GetChildMemberWithName("_addr_bnd");
+ if (!addr_bnds_sp)
+ break;
+
+ auto lower_sp = addr_bnds_sp->GetChildMemberWithName("_lower");
+ if (lower_sp)
+ lower = lower_sp->GetValueAsUnsigned(-1);
+
+ auto upper_sp = addr_bnds_sp->GetChildMemberWithName("_upper");
+ if (upper_sp)
+ upper = upper_sp->GetValueAsUnsigned(-1);
+
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ return linux_signals.GetSignalDescription(signo, code, addr, lower, upper,
+ uid, pid);
+}
+
+lldb::StopInfoSP PlatformLinux::GetStopInfoFromSiginfo(Thread &thread) {
+ ValueObjectSP siginfo_sp = thread.GetSiginfoValue();
+ if (!siginfo_sp)
+ return {};
+ auto signo_sp = siginfo_sp->GetChildMemberWithName("si_signo");
+ auto sicode_sp = siginfo_sp->GetChildMemberWithName("si_code");
+ if (!signo_sp || !sicode_sp)
+ return {};
+
+ std::string siginfo_description = GetDescriptionFromSiginfo(siginfo_sp);
+ if (siginfo_description.empty())
+ return StopInfo::CreateStopReasonWithSignal(
+ thread, signo_sp->GetValueAsUnsigned(-1));
+
+ return StopInfo::CreateStopReasonWithSignal(
+ thread, signo_sp->GetValueAsUnsigned(-1), siginfo_description.c_str(),
+ sicode_sp->GetValueAsUnsigned(0));
+}
diff --git a/lldb/source/Plugins/Platform/Linux/PlatformLinux.h b/lldb/source/Plugins/Platform/Linux/PlatformLinux.h
index 89f0bd709ef60..0fd33b03dcd23 100644
--- a/lldb/source/Plugins/Platform/Linux/PlatformLinux.h
+++ b/lldb/source/Plugins/Platform/Linux/PlatformLinux.h
@@ -62,6 +62,8 @@ class PlatformLinux : public PlatformPOSIX {
CompilerType GetSiginfoType(const llvm::Triple &triple) override;
+ lldb::StopInfoSP GetStopInfoFromSiginfo(Thread &thread) override;
+
std::vector<ArchSpec> m_supported_architectures;
private:
diff --git a/lldb/source/Plugins/Process/Utility/LinuxSignals.cpp b/lldb/source/Plugins/Process/Utility/LinuxSignals.cpp
index 9c4fe55147a28..76c32e376eb4b 100644
--- a/lldb/source/Plugins/Process/Utility/LinuxSignals.cpp
+++ b/lldb/source/Plugins/Process/Utility/LinuxSignals.cpp
@@ -38,6 +38,28 @@
#define ADD_SIGCODE(signal_name, signal_value, code_name, code_value, ...) \
AddSignalCode(signal_value, code_value, __VA_ARGS__)
#endif /* if defined(__linux__) && !defined(__mips__) */
+// See siginfo.h in the Linux Kernel, these codes can be sent for any signal.
+#define ADD_LINUX_SIGNAL(signo, name, ...) \
+ AddSignal(signo, name, __VA_ARGS__); \
+ ADD_SIGCODE(signo, signo, SI_QUEUE, -1, "sent by sigqueue", \
+ SignalCodePrintOption::Sender); \
+ ADD_SIGCODE(signo, signo, SI_TIMER, -2, "sent by timer expiration", \
+ SignalCodePrintOption::Sender); \
+ ADD_SIGCODE(signo, signo, SI_MESGQ, -3, \
+ "sent by real time mesq state change", \
+ SignalCodePrintOption::Sender); \
+ ADD_SIGCODE(signo, signo, SI_ASYNCIO, -4, "sent by AIO completion", \
+ SignalCodePrintOption::Sender); \
+ ADD_SIGCODE(signo, signo, SI_SIGIO, -5, "sent by queued SIGIO", \
+ SignalCodePrintOption::Sender); \
+ ADD_SIGCODE(signo, signo, SI_TKILL, -6, "sent by tkill system call", \
+ SignalCodePrintOption::Sender); \
+ ADD_SIGCODE(signo, signo, SI_DETHREAD, -7, \
+ "sent by execve() killing subsidiary threads", \
+ SignalCodePrintOption::Sender); \
+ ADD_SIGCODE(signo, signo, SI_ASYNCNL, -60, \
+ "sent by glibc async name lookup completion", \
+ SignalCodePrintOption::Sender);
using namespace lldb_private;
@@ -46,13 +68,13 @@ LinuxSignals::LinuxSignals() : UnixSignals() { Reset(); }
void LinuxSignals::Reset() {
m_signals.clear();
// clang-format off
- // SIGNO NAME SUPPRESS STOP NOTIFY DESCRIPTION
- // ====== ============== ======== ====== ====== ===================================================
- AddSignal(1, "SIGHUP", false, true, true, "hangup");
- AddSignal(2, "SIGINT", true, true, true, "interrupt");
- AddSignal(3, "SIGQUIT", false, true, true, "quit");
+ // SIGNO NAME SUPPRESS STOP NOTIFY DESCRIPTION
+ // ====== ============== ======== ====== ====== ===================================================
+ ADD_LINUX_SIGNAL(1, "SIGHUP", false, true, true, "hangup");
+ ADD_LINUX_SIGNAL(2, "SIGINT", true, true, true, "interrupt");
+ ADD_LINUX_SIGNAL(3, "SIGQUIT", false, true, true, "quit");
- AddSignal(4, "SIGILL", false, true, true, "illegal instruction");
+ ADD_LINUX_SIGNAL(4, "SIGILL", false, true, true, "illegal instruction");
ADD_SIGCODE(SIGILL, 4, ILL_ILLOPC, 1, "illegal opcode");
ADD_SIGCODE(SIGILL, 4, ILL_ILLOPN, 2, "illegal operand");
ADD_SIGCODE(SIGILL, 4, ILL_ILLADR, 3, "illegal addressing mode");
@@ -62,15 +84,15 @@ void LinuxSignals::Reset() {
ADD_SIGCODE(SIGILL, 4, ILL_COPROC, 7, "coprocessor error");
ADD_SIGCODE(SIGILL, 4, ILL_BADSTK, 8, "internal stack error");
- AddSignal(5, "SIGTRAP", true, true, true, "trace trap (not reset when caught)");
- AddSignal(6, "SIGABRT", false, true, true, "abort()/IOT trap", "SIGIOT");
+ ADD_LINUX_SIGNAL(5, "SIGTRAP", true, true, true, "trace trap (not reset when caught)");
+ ADD_LINUX_SIGNAL(6, "SIGABRT", false, true, true, "abort()/IOT trap", "SIGIOT");
- AddSignal(7, "SIGBUS", false, true, true, "bus error");
+ ADD_LINUX_SIGNAL(7, "SIGBUS", false, true, true, "bus error");
ADD_SIGCODE(SIGBUS, 7, BUS_ADRALN, 1, "illegal alignment");
ADD_SIGCODE(SIGBUS, 7, BUS_ADRERR, 2, "illegal address");
ADD_SIGCODE(SIGBUS, 7, BUS_OBJERR, 3, "hardware error");
- AddSignal(8, "SIGFPE", false, true, true, "floating point exception");
+ ADD_LINUX_SIGNAL(8, "SIGFPE", false, true, true, "floating point exception");
ADD_SIGCODE(SIGFPE, 8, FPE_INTDIV, 1, "integer divide by zero");
ADD_SIGCODE(SIGFPE, 8, FPE_INTOVF, 2, "integer overflow");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTDIV, 3, "floating point divide by zero");
@@ -80,10 +102,10 @@ void LinuxSignals::Reset() {
ADD_SIGCODE(SIGFPE, 8, FPE_FLTINV, 7, "floating point invalid operation");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTSUB, 8, "subscript out of range");
- AddSignal(9, "SIGKILL", false, true, true, "kill");
- AddSignal(10, "SIGUSR1", false, true, true, "user defined signal 1");
+ ADD_LINUX_SIGNAL(9, "SIGKILL", false, true, true, "kill");
+ ADD_LINUX_SIGNAL(10, "SIGUSR1", false, true, true, "user defined signal 1");
- AddSignal(11, "SIGSEGV", false, true, true, "segmentation violation");
+ ADD_LINUX_SIGNAL(11, "SIGSEGV", false, true, true, "segmentation violation");
ADD_SIGCODE(SIGSEGV, 11, SEGV_MAPERR, 1, "address not mapped to object", SignalCodePrintOption::Address);
ADD_SIGCODE(SIGSEGV, 11, SEGV_ACCERR, 2, "invalid permissions for mapped object", SignalCodePrintOption::Address);
ADD_SIGCODE(SIGSEGV, 11, SEGV_BNDERR, 3, "failed address bounds checks", SignalCodePrintOption::Bounds);
@@ -94,58 +116,58 @@ void LinuxSignals::Reset() {
// codes. One way to get this is via unaligned SIMD loads. Treat it as invalid address.
ADD_SIGCODE(SIGSEGV, 11, SI_KERNEL, 0x80, "invalid address", SignalCodePrintOption::Address);
- AddSignal(12, "SIGUSR2", false, true, true, "user defined signal 2");
- AddSignal(13, "SIGPIPE", false, true, true, "write to pipe with reading end closed");
- AddSignal(14, "SIGALRM", false, false, false, "alarm");
- AddSignal(15, "SIGTERM", false, true, true, "termination requested");
- AddSignal(16, "SIGSTKFLT", false, true, true, "stack fault");
- AddSignal(17, "SIGCHLD", false, false, true, "child status has changed", "SIGCLD");
- AddSignal(18, "SIGCONT", false, false, true, "process continue");
- AddSignal(19, "SIGSTOP", true, true, true, "process stop");
- AddSignal(20, "SIGTSTP", false, true, true, "tty stop");
- AddSignal(21, "SIGTTIN", false, true, true, "background tty read");
- AddSignal(22, "SIGTTOU", false, true, true, "background tty write");
- AddSignal(23, "SIGURG", false, true, true, "urgent data on socket");
- AddSignal(24, "SIGXCPU", false, true, true, "CPU resource exceeded");
- AddSignal(25, "SIGXFSZ", false, true, true, "file size limit exceeded");
- AddSignal(26, "SIGVTALRM", false, true, true, "virtual time alarm");
- AddSignal(27, "SIGPROF", false, false, false, "profiling time alarm");
- AddSignal(28, "SIGWINCH", false, true, true, "window size changes");
- AddSignal(29, "SIGIO", false, true, true, "input/output ready/Pollable event", "SIGPOLL");
- AddSignal(30, "SIGPWR", false, true, true, "power failure");
- AddSignal(31, "SIGSYS", false, true, true, "invalid system call");
- AddSignal(32, "SIG32", false, false, false, "threading library internal signal 1");
- AddSignal(33, "SIG33", false, false, false, "threading library internal signal 2");
- AddSignal(34, "SIGRTMIN", false, false, false, "real time signal 0");
- AddSignal(35, "SIGRTMIN+1", false, false, false, "real time signal 1");
- AddSignal(36, "SIGRTMIN+2", false, false, false, "real time signal 2");
- AddSignal(37, "SIGRTMIN+3", false, false, false, "real time signal 3");
- AddSignal(38, "SIGRTMIN+4", false, false, false, "real time signal 4");
- AddSignal(39, "SIGRTMIN+5", false, false, false, "real time signal 5");
- AddSignal(40, "SIGRTMIN+6", false, false, false, "real time signal 6");
- AddSignal(41, "SIGRTMIN+7", false, false, false, "real time signal 7");
- AddSignal(42, "SIGRTMIN+8", false, false, false, "real time signal 8");
- AddSignal(43, "SIGRTMIN+9", false, false, false, "real time signal 9");
- AddSignal(44, "SIGRTMIN+10", false, false, false, "real time signal 10");
- AddSignal(45, "SIGRTMIN+11", false, false, false, "real time signal 11");
- AddSignal(46, "SIGRTMIN+12", false, false, false, "real time signal 12");
- AddSignal(47, "SIGRTMIN+13", false, false, false, "real time signal 13");
- AddSignal(48, "SIGRTMIN+14", false, false, false, "real time signal 14");
- AddSignal(49, "SIGRTMIN+15", false, false, false, "real time signal 15");
- AddSignal(50, "SIGRTMAX-14", false, false, false, "real time signal 16"); // switching to SIGRTMAX-xxx to match "kill -l" output
- AddSignal(51, "SIGRTMAX-13", false, false, false, "real time signal 17");
- AddSignal(52, "SIGRTMAX-12", false, false, false, "real time signal 18");
- AddSignal(53, "SIGRTMAX-11", false, false, false, "real time signal 19");
- AddSignal(54, "SIGRTMAX-10", false, false, false, "real time signal 20");
- AddSignal(55, "SIGRTMAX-9", false, false, false, "real time signal 21");
- AddSignal(56, "SIGRTMAX-8", false, false, false, "real time signal 22");
- AddSignal(57, "SIGRTMAX-7", false, false, false, "real time signal 23");
- AddSignal(58, "SIGRTMAX-6", false, false, false, "real time signal 24");
- AddSignal(59, "SIGRTMAX-5", false, false, false, "real time signal 25");
- AddSignal(60, "SIGRTMAX-4", false, false, false, "real time signal 26");
- AddSignal(61, "SIGRTMAX-3", false, false, false, "real time signal 27");
- AddSignal(62, "SIGRTMAX-2", false, false, false, "real time signal 28");
- AddSignal(63, "SIGRTMAX-1", false, false, false, "real time signal 29");
- AddSignal(64, "SIGRTMAX", false, false, false, "real time signal 30");
+ ADD_LINUX_SIGNAL(12, "SIGUSR2", false, true, true, "user defined signal 2");
+ ADD_LINUX_SIGNAL(13, "SIGPIPE", false, true, true, "write to pipe with reading end closed");
+ ADD_LINUX_SIGNAL(14, "SIGALRM", false, false, false, "alarm");
+ ADD_LINUX_SIGNAL(15, "SIGTERM", false, true, true, "termination requested");
+ ADD_LINUX_SIGNAL(16, "SIGSTKFLT", false, true, true, "stack fault");
+ ADD_LINUX_SIGNAL(17, "SIGCHLD", false, false, true, "child status has changed", "SIGCLD");
+ ADD_LINUX_SIGNAL(18, "SIGCONT", false, false, true, "process continue");
+ ADD_LINUX_SIGNAL(19, "SIGSTOP", true, true, true, "process stop");
+ ADD_LINUX_SIGNAL(20, "SIGTSTP", false, true, true, "tty stop");
+ ADD_LINUX_SIGNAL(21, "SIGTTIN", false, true, true, "background tty read");
+ ADD_LINUX_SIGNAL(22, "SIGTTOU", false, true, true, "background tty write");
+ ADD_LINUX_SIGNAL(23, "SIGURG", false, true, true, "urgent data on socket");
+ ADD_LINUX_SIGNAL(24, "SIGXCPU", false, true, true, "CPU resource exceeded");
+ ADD_LINUX_SIGNAL(25, "SIGXFSZ", false, true, true, "file size limit exceeded");
+ ADD_LINUX_SIGNAL(26, "SIGVTALRM", false, true, true, "virtual time alarm");
+ ADD_LINUX_SIGNAL(27, "SIGPROF", false, false, false, "profiling time alarm");
+ ADD_LINUX_SIGNAL(28, "SIGWINCH", false, true, true, "window size changes");
+ ADD_LINUX_SIGNAL(29, "SIGIO", false, true, true, "input/output ready/Pollable event", "SIGPOLL");
+ ADD_LINUX_SIGNAL(30, "SIGPWR", false, true, true, "power failure");
+ ADD_LINUX_SIGNAL(31, "SIGSYS", false, true, true, "invalid system call");
+ ADD_LINUX_SIGNAL(32, "SIG32", false, false, false, "threading library internal signal 1");
+ ADD_LINUX_SIGNAL(33, "SIG33", false, false, false, "threading library internal signal 2");
+ ADD_LINUX_SIGNAL(34, "SIGRTMIN", false, false, false, "real time signal 0");
+ ADD_LINUX_SIGNAL(35, "SIGRTMIN+1", false, false, false, "real time signal 1");
+ ADD_LINUX_SIGNAL(36, "SIGRTMIN+2", false, false, false, "real time signal 2");
+ ADD_LINUX_SIGNAL(37, "SIGRTMIN+3", false, false, false, "real time signal 3");
+ ADD_LINUX_SIGNAL(38, "SIGRTMIN+4", false, false, false, "real time signal 4");
+ ADD_LINUX_SIGNAL(39, "SIGRTMIN+5", false, false, false, "real time signal 5");
+ ADD_LINUX_SIGNAL(40, "SIGRTMIN+6", false, false, false, "real time s...
[truncated]
|
Unfortunately not, but I can apply this patch locally and tell you if it passes if that helps? |
✅ With the latest revision this PR passed the C/C++ code formatter. |
…t before we parse the notes
b0e7574
to
7fcf30e
Compare
That would be incredibly nice! I did some manual testing but I'm fighting my Mac on getting the tests to not come up as unsupported. I'd feel a lot more confident with a second double-check |
|
We need to handle situations where the core won't have a valid platform, and then fallback to other info (like PRSTATUS). Please check the last commit in this patch. I think this will almost exclusively be an artifact of our tests, but I'm not sure how else to handle this |
…t support siginfo
46af35d
to
b6fa2d2
Compare
So, this particular failure is due to broken/incomplete support for these architectures (they weren't added to this list). The list only matters on mac because we probably end up somehow falling back to the host platform. I expect adding them there would fix this. However I also think it makes sense to not fail catastrophically in case we cannot read/parse signal info, so I'm fine with the change you made in principle, but the I find the implementation somewhat unelegant. Do we actually need to access the platform class from |
…tractor a string ref directly
😎 That's certainly me! In all seriousness, I am still drinking from the proverbial firehouse. So I appreciate the patience as I learn the codebase (even a year later). You are correct, the checks are now unimportant because |
76891c7
to
c083af6
Compare
@JDevlieghere I did run this on my local Mac (Very slowly on an M1 🥲). Got no failures, but still FYI |
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/197/builds/5997 Here is the relevant piece of the build log for the reference
|
Put up a fix for Windows on #141971 |
Hey @felipepiovezan am I reading green dragon right https://green.lab.llvm.org/job/llvm.org/job/as-lldb-cmake/changes Looks like the build with my changes failed (with I believe unrelated test failures), then went green? Does that mean we're working on Darwin? |
Another iteration of fixes for #141670. Platform linux can be used by other platforms, so we need to supply the signal values if they're not defined. Values are from the [manpage](https://man7.org/linux/man-pages/man7/signal.7.html)
…." (#141670) After some debugging, I found out ProcessELFCore never updates the platform. I've updated ProcessElfCore to set the arch and platform before we parse the Notes.
Another iteration of fixes for #141670. Platform linux can be used by other platforms, so we need to supply the signal values if they're not defined. Values are from the [manpage](https://man7.org/linux/man-pages/man7/signal.7.html)
…." (llvm#141670) After some debugging, I found out ProcessELFCore never updates the platform. I've updated ProcessElfCore to set the arch and platform before we parse the Notes.
Another iteration of fixes for llvm#141670. Platform linux can be used by other platforms, so we need to supply the signal values if they're not defined. Values are from the [manpage](https://man7.org/linux/man-pages/man7/signal.7.html)
After this and the Windows ifdef fixup,
I'm trying to find the cause. NetBSD and FreeBSD cores still work but we don't have any non-x86 cores for those. Linux x86, Arm, AArch64, s390x are working too. So I suspect some method is not filled in for the 3 broken targets but it's proving tricky to find. No signs of issues on Linux hosts either, so it could be some assumption we have to make if we are compiled on a non-Linux host, that does not hold true for those 3 architectures or they haven't implemented the fallback method for it. Doesn't help that all 3 of them don't have upstream bots, because they might be failing in their own native builds too but we wouldn't know. If I don't find anything in the next couple of hours I'm going to revert this so we don't have failures piling up over the weekend. I will continue to investigate though. |
After llvm#141670, TestLinuxCore.py was timing out on our Windows on Arm bot. Non-Linux core files were ok, as were Linux core files unless it was ppc64le, riscv64 or loongarch. I eventually noticed that it was attempting to create PlatformLinux many times before trying PlatformAndroid, PlatformMac etc., which it should never need to do. The tests passed on a Linux host too, to add to the mystery. Turns out, all I needed to do was mark those architectures as supported in the PlatformLinux constructor. If they're not listed there we get stuck here: ``` // Wait for a stopped event since we just posted one above... printf("waiting for process to stop...\n"); lldb::EventSP event_sp; StateType state = WaitForProcessToStop(std::nullopt, &event_sp, true, listener_sp, nullptr, true, SelectMostRelevantFrame); printf("process stopped\n"); ``` Waiting for a stop event that never comes, because it appears we try to treat the core as a real process? ``` DynamicLoaderPOSIXDYLD::virtual DynamicLoaderPOSIXDYLD::DidAttach pid 28147 executable '<null executable>', load_offset 0xffffffffffffffff <...> Process::ShouldBroadcastEvent (000002ABC43FF4A0) Restarting process from state: stopped Process::PrivateResume() m_stop_id = 1, public state: unloaded private state: stopped Process::PrivateResume() got an error "error: elf-core does not support resuming processes". Process::ShouldBroadcastEvent (000002ABC43FF4A0) => new state: stopped, last broadcast state: invalid - NO ``` Some sort of actionable feedback here would be nice, but all I care about for now is that the tests run again. I have not added riscv32 as that appears to only be supported for Darwin at the moment (though I expect someone will get burned by this when it is). I think debug on these architectures worked if they were also the host arch, if someone tried to remote debug them, I think it would fail.
After #141670, TestLinuxCore.py was timing out on our Windows on Arm bot. Non-Linux core files were ok, as were Linux core files unless it was ppc64le, riscv64 or loongarch. I eventually noticed that it was attempting to create PlatformLinux many times before trying PlatformAndroid, PlatformMac etc., which it should never need to do. The tests passed on a Linux host too, to add to the mystery. Turns out, all I needed to do was mark those architectures as supported in the PlatformLinux constructor. If they're not listed there we get stuck here: ``` // Wait for a stopped event since we just posted one above... printf("waiting for process to stop...\n"); lldb::EventSP event_sp; StateType state = WaitForProcessToStop(std::nullopt, &event_sp, true, listener_sp, nullptr, true, SelectMostRelevantFrame); printf("process stopped\n"); ``` Waiting for a stop event that never comes, because it appears we try to treat the core as a real process? ``` DynamicLoaderPOSIXDYLD::virtual DynamicLoaderPOSIXDYLD::DidAttach pid 28147 executable '<null executable>', load_offset 0xffffffffffffffff <...> Process::ShouldBroadcastEvent (000002ABC43FF4A0) Restarting process from state: stopped Process::PrivateResume() m_stop_id = 1, public state: unloaded private state: stopped Process::PrivateResume() got an error "error: elf-core does not support resuming processes". Process::ShouldBroadcastEvent (000002ABC43FF4A0) => new state: stopped, last broadcast state: invalid - NO ``` Some actionable feedback here would be nice, but all I care about for now is that the tests run again. I have not added riscv32 as that appears to only be supported for Darwin at the moment (I expect someone will get burned by this when it is). I think debug on these architectures worked if they were also the host arch, if someone tried to remote debug them, I think it would have failed.
After llvm/llvm-project#141670, TestLinuxCore.py was timing out on our Windows on Arm bot. Non-Linux core files were ok, as were Linux core files unless it was ppc64le, riscv64 or loongarch. I eventually noticed that it was attempting to create PlatformLinux many times before trying PlatformAndroid, PlatformMac etc., which it should never need to do. The tests passed on a Linux host too, to add to the mystery. Turns out, all I needed to do was mark those architectures as supported in the PlatformLinux constructor. If they're not listed there we get stuck here: ``` // Wait for a stopped event since we just posted one above... printf("waiting for process to stop...\n"); lldb::EventSP event_sp; StateType state = WaitForProcessToStop(std::nullopt, &event_sp, true, listener_sp, nullptr, true, SelectMostRelevantFrame); printf("process stopped\n"); ``` Waiting for a stop event that never comes, because it appears we try to treat the core as a real process? ``` DynamicLoaderPOSIXDYLD::virtual DynamicLoaderPOSIXDYLD::DidAttach pid 28147 executable '<null executable>', load_offset 0xffffffffffffffff <...> Process::ShouldBroadcastEvent (000002ABC43FF4A0) Restarting process from state: stopped Process::PrivateResume() m_stop_id = 1, public state: unloaded private state: stopped Process::PrivateResume() got an error "error: elf-core does not support resuming processes". Process::ShouldBroadcastEvent (000002ABC43FF4A0) => new state: stopped, last broadcast state: invalid - NO ``` Some actionable feedback here would be nice, but all I care about for now is that the tests run again. I have not added riscv32 as that appears to only be supported for Darwin at the moment (I expect someone will get burned by this when it is). I think debug on these architectures worked if they were also the host arch, if someone tried to remote debug them, I think it would have failed.
…." (llvm#141670) After some debugging, I found out ProcessELFCore never updates the platform. I've updated ProcessElfCore to set the arch and platform before we parse the Notes.
Another iteration of fixes for llvm#141670. Platform linux can be used by other platforms, so we need to supply the signal values if they're not defined. Values are from the [manpage](https://man7.org/linux/man-pages/man7/signal.7.html)
After llvm#141670, TestLinuxCore.py was timing out on our Windows on Arm bot. Non-Linux core files were ok, as were Linux core files unless it was ppc64le, riscv64 or loongarch. I eventually noticed that it was attempting to create PlatformLinux many times before trying PlatformAndroid, PlatformMac etc., which it should never need to do. The tests passed on a Linux host too, to add to the mystery. Turns out, all I needed to do was mark those architectures as supported in the PlatformLinux constructor. If they're not listed there we get stuck here: ``` // Wait for a stopped event since we just posted one above... printf("waiting for process to stop...\n"); lldb::EventSP event_sp; StateType state = WaitForProcessToStop(std::nullopt, &event_sp, true, listener_sp, nullptr, true, SelectMostRelevantFrame); printf("process stopped\n"); ``` Waiting for a stop event that never comes, because it appears we try to treat the core as a real process? ``` DynamicLoaderPOSIXDYLD::virtual DynamicLoaderPOSIXDYLD::DidAttach pid 28147 executable '<null executable>', load_offset 0xffffffffffffffff <...> Process::ShouldBroadcastEvent (000002ABC43FF4A0) Restarting process from state: stopped Process::PrivateResume() m_stop_id = 1, public state: unloaded private state: stopped Process::PrivateResume() got an error "error: elf-core does not support resuming processes". Process::ShouldBroadcastEvent (000002ABC43FF4A0) => new state: stopped, last broadcast state: invalid - NO ``` Some actionable feedback here would be nice, but all I care about for now is that the tests run again. I have not added riscv32 as that appears to only be supported for Darwin at the moment (I expect someone will get burned by this when it is). I think debug on these architectures worked if they were also the host arch, if someone tried to remote debug them, I think it would have failed.
…#143793) Since this PR: #141670 We started to override the Platform/Arch for a target if needed. However we may have already registered locate module callback with the old platform. This PR will move the locate module callback to the new Platform whenever Target changes architecture. Co-authored-by: George Hu <georgehuyubo@gmail.com>
…change arch (#143793) Since this PR: llvm/llvm-project#141670 We started to override the Platform/Arch for a target if needed. However we may have already registered locate module callback with the old platform. This PR will move the locate module callback to the new Platform whenever Target changes architecture. Co-authored-by: George Hu <georgehuyubo@gmail.com>
…llvm#143793) Since this PR: llvm#141670 We started to override the Platform/Arch for a target if needed. However we may have already registered locate module callback with the old platform. This PR will move the locate module callback to the new Platform whenever Target changes architecture. Co-authored-by: George Hu <georgehuyubo@gmail.com>
After some debugging, I found out ProcessELFCore never updates the platform. I've updated ProcessElfCore to set the arch and platform before we parse the Notes.