Мне нужно было проверить код ошибки std::system_error
, выполняющей мой проект.Но когда я сделал это, я получил SIGSEGV
.
foo.cpp
:
#include <thread>
#include <iostream>
#include <system_error>
int main(void)
{
std::thread t1;
try
{
t1.join();
}
catch (const std::system_error& e)
{
std::cout << "System error\n";
if (e.code() == std::errc::invalid_argument) // here in the operator==(), running into SIGSEGV
{
std::cout << e.what() << "\n";
}
else
{
throw;
}
}
return 0;
}
Makefile
:
.PHONY: all clean
all: foo
SRCS := $(shell find . -name '*.cpp')
OBJS := $(SRCS:.cpp=.o)
foo: $(OBJS)
gcc -o $@ $^ -lstdc++ -lpthread
%.o: %.cpp
gcc -std=c++17 -Wall -c -g -O0 -pthread -o $@ $<
clean:
rm -rf foo *.o
Моя версия gcc:
$ gcc --version
gcc (GCC) 7.2.1 20170829 (Red Hat 7.2.1-1)
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Когда я публиковал этот вопрос, StackOverflow предлагал похожие вопросы.Одним из них является Как переносимо сравнить исключения std :: system_error со значениями std :: errc? .То, что описано в нем, казалось, тесно связано с проблемой, которую я рассматриваю.Поэтому я проверил gcc 8.3, который был в списке исправленных версий gcc.
Исправлено во всех активных ветвях, поэтому будет исправлено в версиях 6.5, 7.4, 8.3 и 9.1.
Но, похоже, он все еще не исправлен, или это просто еще одна проблема:
$ gcc --version
gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ make
gcc -std=c++17 -Wall -c -g -O0 -pthread -o foo.o foo.cpp
gcc -o foo foo.o -lstdc++ -lpthread
$ ./foo
System error
Segmentation fault (core dumped)
Любые идеи, позволяющие обойти эту проблему и определить, какая это ошибка на самом деле, когда system_error
происходит?
Редактировать: Добавление информации о трассировке с помощью gdb
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000003603269ca2 in std::error_category::equivalent(std::error_code const&, int) const () from /usr/lib64/libstdc++.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.x86_64 libgcc-4.4.7-17.el6.x86_64 libstdc++-4.4.7-17.el6.x86_64
(gdb) where
#0 0x0000003603269ca2 in std::error_category::equivalent(std::error_code const&, int) const () from /usr/lib64/libstdc++.so.6
#1 0x000000000040285f in std::operator== (__lhs=..., __rhs=...) at /opt/rh/devtoolset-7/root/usr/include/c++/7/system_error:299
#2 0x0000000000402628 in main () at foo.cpp:17