Меню

Dotnet new console ошибка сегментирования стек памяти сброшен на диск

  • Печать

Страницы: [1] 2  Все   Вниз

Тема: Ошибка сегментирования при установки .net sdk  (Прочитано 1476 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн
Stell_a

dotnet new —help // я выполнил вот эту команду
Получил вот эту ошибку: Ошибка сегментирования (стек памяти сброшен на диск)

Устанавливал .donnet sdk так:

sudo snap install dotnet-sdk --classic
sudo snap alias dotnet-sdk.dotnet dotnet

Как это можно исправить


Оффлайн
damix

Stell_a, какую версию надо поставить?

inxi -SC
dotnet --list-sdks
что выдает?
Попробуйте этот способ.


Оффлайн
Stell_a

stell@BMH-WCX9:~$ inxi -SC
System:
  Host: BMH-WCX9 Kernel: 5.15.0-27-generic x86_64 bits: 64
    Desktop: GNOME 42.0 Distro: Ubuntu 22.04 LTS (Jammy Jellyfish)
CPU:
  Info: 6-core model: AMD Ryzen 5 5500U with Radeon Graphics bits: 64
    type: MT MCP cache: L2: 3 MiB
  Speed (MHz): avg: 2020 min/max: 1400/4056 cores: 1: 2369 2: 3007 3: 1407
    4: 3047 5: 2610 6: 2067 7: 1505 8: 1425 9: 2203 10: 1397 11: 1715 12: 1490
stell@BMH-WCX9:~$ dotnet --list-sdks
6.0.202 [/snap/dotnet-sdk/162/sdk]
stell@BMH-WCX9:~$


Оффлайн
damix

Ну и после того способа снова посмотрите, чего получается.

dotnet --list-sdks
dotnet new --help
which dotnet


Оффлайн
Stell_a

Ввожу:

./dotnet-install.sh -c CurrentДальше ничего не происходит:

dotnet-install: Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:
dotnet-install: - The SDK needs to be installed without user interaction and without admin rights.
dotnet-install: - The SDK installation doesn't need to persist across multiple CI runs.
dotnet-install: To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.

dotnet-install: Attempting to download using aka.ms link https://dotnetcli.azureedge.net/dotnet/Sdk/6.0.202/dotnet-sdk-6.0.202-linux-x64.tar.gz


Пользователь добавил сообщение 09 Мая 2022, 16:42:03:


Разобрался нужно просто перейти по ссылке и скачать, только теперь пишу

dotnet new --help
И не выводит список доступных sdk


Пользователь добавил сообщение 09 Мая 2022, 16:49:26:


Попробуйте этот способ.

Это устанавливает, но пишет что

Команда «dotnet» не найдена, но может быть установлена с помощью:
sudo snap install dotnet-sdk

« Последнее редактирование: 09 Мая 2022, 16:49:26 от Stell_a »


Оффлайн
damix

Команда «dotnet» не найдена

echo $DOTNET_ROOT
echo $PATH


Оффлайн
Stell_a

Все равно пишет: Ошибка сегментирования (стек памяти сброшен на диск)
Может переустановить, только как теперь удалить .net?


Оффлайн
damix

Просто удалить папку и убрать из bashrc что добавили. Но переустанавливать — без толку.
А что команды выдают?

dotnet --list-sdks
dotnet new --help
which dotnet


Пользователь добавил сообщение 09 Мая 2022, 18:47:44:


echo $DOTNET_ROOT

« Последнее редактирование: 09 Мая 2022, 18:47:44 от damix »


Оффлайн
Stell_a

dotnet —list-sdks

stell@BMH-WCX9:~$ dotnet --list-sdks
6.0.202 [/snap/dotnet-sdk/162/sdk]
dotnet new —help

stell@BMH-WCX9:~$ dotnet new --help
Ошибка сегментирования (стек памяти сброшен на диск)

stell@BMH-WCX9:~$ which dotnet
/snap/bin/dotnet

echo $DOTNET_ROOT ничего не выводит.

echo $PATH

stell@BMH-WCX9:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin


Оффлайн
damix

Зависимости все установлены согласно инструкции по ссылке?


Оффлайн
Stell_a

./dotnet-install.sh -c Current
./dotnet-install.sh -c Current --runtime aspnetcore

И потом вот эти команды ввел по очереди:

DOTNET_FILE=dotnet-sdk-6.0.100-linux-x64.tar.gz
export DOTNET_ROOT=$(pwd)/.dotnet

mkdir -p "$DOTNET_ROOT" && tar zxf "$DOTNET_FILE" -C "$DOTNET_ROOT"

export PATH=$PATH:$DOTNET_ROOT


Пользователь добавил сообщение 09 Мая 2022, 21:50:25:


ТОлько версию dotneta поменял


Оффлайн
damix

Stell_a, вот зависимости.

./dotnet-install.sh -c Current
./dotnet-install.sh -c Current —runtime aspnetcore

я предлагал Manual install, а это Scripted install.

И потом вот эти команды ввел по очереди:

И что вывело?

Удалите dotnet из снапа и

export DOTNET_ROOT=/opt/dotnet
export PATH=$DOTNET_ROOT:$PATH
echo $DOTNET_ROOT
echo $PATH
which dotnet
dotnet new --help
dotnet --list-sdks
где вместо

/opt/dotnet

путь, где лежит устанолвенный вручную dotnet.


Оффлайн
Stell_a

И что вывело?

stell@BMH-WCX9:~$ mkdir -p "$DOTNET_ROOT" && tar zxf "$DOTNET_FILE" -C "$DOTNET_ROOT"
tar (child): dotnet-sdk-6.0.100-linux-x64.tar.gz: Функция open завершилась с ошибкой: Нет такого файла или каталога
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

Все остальные ничего не выводят, я попробовал установить, скачал dotnet install scripts
Вручную там написано скачать пакет sdk но я перешел по ссылке https://dotnet.microsoft.com/en-us/download/dotnet/6.0 и что из этого качать не понимаю там есть только bash скрипт


Пользователь добавил сообщение 10 Мая 2022, 11:17:29:


Зависимости проверил, все установлены уже были.

« Последнее редактирование: 10 Мая 2022, 11:17:29 от Stell_a »


Оффлайн
damix


Оффлайн
jurganov

« Последнее редактирование: 10 Мая 2022, 18:21:02 от jurganov »


  • Печать

Страницы: [1] 2  Все   Вверх

When I try to run ‘dotnet new console’ in either the Ubuntu or VS Code Terminal, I get the following error

Segmentation fault (core dumped)

Running it in the Ubuntu Terminal seems to give more information, looks like it’s failing to do the ‘dotnet restore’ that automatically runs when you do ‘dotnet new console’

Getting ready...
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on /home/max/Programming/C Sharp/Hello World/Hello World.csproj...
  Determining projects to restore...
Restore failed.
Post action failed.
Description: Restore NuGet packages required by this project.
Manual instructions: Run 'dotnet restore'

Segmentation fault (core dumped)

Running dotnet restore manually just gives the segfault error

Version of Ubuntu is 21.04, I have already installed everything as per https://learn.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2104-

Another thing to note is that I can build and run C Sharp applications fine in Monodevelop, and I can run non .NET languages such as Python fine in VS Code

Any ideas / assistance would be appreciated, thanks

@omajid

Can you run an strace and upload the log file (logfile below) somewhere?

strace -f -o logfile dotnet new console -o hwapp

Edit: does dotnet --info work?

@erralb

Here you go :

$ dotnet --info
.NET Command Line Tools (2.0.0)

Product Information:
 Version:            2.0.0
 Commit SHA-1 hash:  cdcd1928c9

Runtime Environment:
 OS Name:     debian
 OS Version:  
 OS Platform: Linux
 RID:         debian-x64
 Base Path:   /usr/share/dotnet/sdk/2.0.0/

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.0
  Build    : e8b8861ac7faf042c87a5c2f9f2d04c98b69f28d

The strace also returns a segmentation fault :


$ strace -f -o logfile dotnet new console -o hwapp
Getting ready...
[1]    1297 segmentation fault  strace -f -o logfile dotnet new console -o hwapp

@erralb

Hi, any news on this ? Anything else I can do to help debug?

@Petermarcu

@livarcocc is this the one people have been working around by disabling the first run experience?

@Petermarcu

@erralb

export DOTNET_CLI_TELEMETRY_OPTOUT=1

removed the segmentation fault for me

woxip0, englebt, marcan2020, lakesare, diegotrujillor, agiv, matheuspicioli, rafed, yhnavein, schmidbt, and 28 more reacted with thumbs up emoji
bashforger, Shahed-Atik, and DoginUwU reacted with hooray emoji
vitorpiovezam, gilles-leblanc, c-zab, RedlineTriad, Scharps, bashforger, kolaczyn, Dunigan, and DoginUwU reacted with heart emoji
bashforger and DoginUwU reacted with rocket emoji
bashforger and DoginUwU reacted with eyes emoji

@Petermarcu

@erralb

should I close the issue or you want it left open until a real fix has been issued?

@Petermarcu

Lets leave it open until @livarcocc confirms that there is an issue somewhere tracking the fix. Once we have that, this can be closed. Thanks @ierpe!

@livarcocc

@Petermarcu @steveharter can you help debug this and understand why the telemetry code is causing a seg fault? If this were in native code, I would expect a stack trace somewhere. But we will investigate.

@omajid

@erralb

@steveharter

@livarcocc I’m installing fresh debian now, will report back tomorrow.

@steveharter

I couldn’t repro. I used debian stretch. One difference is that dotnet --info reports the RID as Linux-x64 instead of debian-x64.

dotnet --info
.NET Command Line Tools (2.0.0)

Product Information:
 Version:            2.0.0
 Commit SHA-1 hash:  cdcd1928c9

Runtime Environment:
 OS Name:     debian
 OS Version:  9
 OS Platform: Linux
 RID:         linux-x64
 Base Path:   /usr/share/dotnet/sdk/2.0.0/

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.0
  Build    : e8b8861ac7faf042c87a5c2f9f2d04c98b69f28d

@ierpe what is the contents of your /etc/apt/sources.list.d/dotnetdev.list file? I have:

deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main

@icedfish

the same issue @Mac
the official guide says:

dotnet new console -o hwapp
cd hwapp

I checked the dotnet help (dotnet core sdk 2.0)

~ dotnet help new
.NET Initializer

Usage: dotnet new [options]

Options:
  -h|--help             Show help information
  -l|--lang <LANGUAGE>  Language of project [C#|F#]
  -t|--type <TYPE>      Type of project
➜  source mkdir dotnet

all the guide shuold be update to :

mkdir -p hwapp
cd hwapp
dotnet new -t console

@erralb

@steveharter

FWIW here’s my Debian Stretch environment (no repro, clean install)


$ curl -V
curl 7.52.1 (x86_64-pc-linux-gnu) libcurl/7.52.1 OpenSSL/1.0.2l zlib/1.2.8 libidn2/0.16 libpsl/0.17.0 (+libidn2/0.16) libssh2/1.7.0 nghttp2/1.18.1 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL

$ openssl version
OpenSSL 1.1.0f  25 May 2017

$ cat /proc/version
Linux version 4.9.0-3-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18) ) #1 SMP Debian 4.9.30-2+deb9u5 (2017-09-19)

$ cat /etc/*-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

@steveharter

@icedfish

the same issue @mac

So you’re also getting the seg fault during dotnet new console?

Does export DOTNET_CLI_TELEMETRY_OPTOUT=1 prevent the seg fault?

@steveharter

@ierpe have you tried to debug the seg fault, or look at any dumps in order to determine the crashing modulestack? I can send you gdb instructions.

@omajid

@icedfish

I checked the dotnet help (dotnet core sdk 2.0)

Can you confirm this? What does dotnet --version say? What does dotnet --info say?

~ dotnet help new
.NET Initializer

Usage: dotnet new [options]

Options:
  -h|--help             Show help information
  -l|--lang <LANGUAGE>  Language of project [C#|F#]
  -t|--type <TYPE>      Type of project
➜  source mkdir dotnet

That looks like the older 1.0 Preview SDK. -t does not work with the 1.x or 2.x SDKs.

@erralb

@steveharter

@ierpe probably the easiest way is to catch the seg fault with gdb if you can. You’ll likely need to be root to install that. So

su
apt-get install gdb
exit

and then run dotnet:

gdb --args dotnet new console
run

after seg fault

hopefully you get a crashing module (libcurl?) and stack.

@icedfish

@omajid sorry , I checked my system, find that I used to install the old 1.0RC SDK before install the new 2.0 sdk.

after uninstall the old version by the cli script
and reinstalled the sdk 2.0, It’s ok now.

But it’s really puzzle, the the 2.0 sdk not remove the old sdk automaticlly or even notify me the incompact…..

@erralb

@steveharter is that what you wanted ?


$ gdb --args dotnet new console
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from dotnet...(no debugging symbols found)...done.
(gdb) run
Starting program: /usr/bin/dotnet new console
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7f0ea6576700 (LWP 11703)]
[New Thread 0x7f0e9ffff700 (LWP 11704)]
[New Thread 0x7f0ea5d75700 (LWP 11705)]
[New Thread 0x7f0ea5574700 (LWP 11706)]
[New Thread 0x7f0ea4d73700 (LWP 11707)]
[New Thread 0x7f0e9f7fe700 (LWP 11708)]
[New Thread 0x7f0e2e140700 (LWP 11709)]
[Thread 0x7f0e2e140700 (LWP 11709) exited]
[New Thread 0x7f0e2e140700 (LWP 11710)]
[New Thread 0x7f0ea41b9700 (LWP 11711)]
[New Thread 0x7f0e2d93f700 (LWP 11712)]
[New Thread 0x7f0e2d13e700 (LWP 11713)]
[New Thread 0x7f0ea4178700 (LWP 11714)]
[New Thread 0x7f0e07ffd700 (LWP 11715)]
[New Thread 0x7f0e077fc700 (LWP 11716)]
[New Thread 0x7f0deed59700 (LWP 11717)]
[New Thread 0x7f0dee558700 (LWP 11718)]
[Thread 0x7f0dee558700 (LWP 11718) exited]

Thread 16 "dotnet" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7f0deed59700 (LWP 11717)]
0x00007f0e2c67dd6d in ?? () from /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
(gdb) backtrace
#0  0x00007f0e2c67dd6d in ?? ()
   from /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
#1  0x00007f0e2c678c8b in X509_verify_cert ()
   from /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
#2  0x00007f0e31168e06 in ?? ()
#3  0x00007f0deed57e50 in ?? ()
#4  0x6c00fa377b77ae7b in ?? ()
#5  0x0000000007bcbd60 in ?? ()
#6  0x00007f0ea83f5488 in ?? ()
   from /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/libcoreclr.so
#7  0x00007f0deed58688 in ?? ()
#8  0x00007f0e312a2580 in ?? ()
#9  0x00007f0e312a2580 in ?? ()
#10 0x00007f0deed57e50 in ?? ()
#11 0x00007f0e31168e06 in ?? ()
#12 0x00007f0deed57ee0 in ?? ()
#13 0x00007f0e312a2580 in ?? ()
#14 0x00007f0e083b6760 in ?? ()
#15 0x0000000000000001 in ?? ()
#16 0x00007f0e080de958 in ?? ()
#17 0x00007f0e08634f90 in ?? ()
#18 0x00007f0e08634f20 in ?? ()
#19 0x00007f0e083b6760 in ?? ()
---Type <return> to continue, or q <return> to quit---
#20 0x00007f0de40ff270 in ?? ()
#21 0x00007f0deed57f50 in ?? ()
#22 0x00007f0e30f7ce57 in ?? ()
#23 0x00007f0deed57ef0 in ?? ()
#24 0x00007f0e08634f20 in ?? ()
#25 0x00007f0e080de958 in ?? ()
#26 0x0000000000000000 in ?? ()

@steveharter

@ierpe yes thanks. It is likely crashing when calling into OpenSsl.

Can you run a couple commands please:
$ openssl version
and
ls /usr/lib/x86_64-linux-gnu/libssl.so.*

You should get back
OpenSSL 1.1.0f 25 May 2017
and
/usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 /usr/lib/x86_64-linux-gnu/libssl.so.1.1

If not, and you’re getting the 1.0.0 version you can give this a try:

apt-get remove ssl1.0.0
apt-get install ssl1.0.2

@erralb

@steveharter


$ openssl version
OpenSSL 1.1.0f  25 May 2017

$ ls /usr/lib/x86_64-linux-gnu/libssl.so.*
/usr/lib/x86_64-linux-gnu/libssl.so.1.0.0
/usr/lib/x86_64-linux-gnu/libssl.so.1.0.2
/usr/lib/x86_64-linux-gnu/libssl.so.1.1

@steveharter

@ierpe since you have the 1.0.0 version, that is likely conflicting and has been a problem for others. You can remove that by doing an apt-get remove ssl1.0.0

Typically the 1.0.0 version is there due to an upgrade to stretch or buster, and not a clean install. It could have come from another app’s dependency as well.

cc @bartonjs is there an issue to address this in some manner? Like if 1.0.2 is there use that first. Thanks

@erralb

@steveharter removing ssl1.0.0 fixed it for me, thanks for the support!

@thetravis

@steveharter The reason I had 1.0.0 version was that spotify-client depends on it and I had manually installed it. Please refer to my post in #649

This was referenced

May 17, 2018

@JoeKays

I have multiple apps that depend on version 1.0.0 and others that depend on 1.0.2.
What do I do?

Most dotnet commands I run on my Ubuntu 20.04 system
gives me the error:
Segmentation fault (core dumped)

I tried rerunning the dotnet installation scripts and I tried modifying the stack size with uint -n (as advised on the internet).
(It’s important to note that I was using the backend of an app on dotnet
without any problems, and this error seems to have come out of nowhere.)

I cannot find a solution for this.
What can I do to fix this?

The following commands produce the segfault:

  • dotnet -h
  • dotnet --info

The following commands do not produce a segfault:

  • dotnet (without any arguments)
  • dotnet --list-sdks
  • dotnet --list-runtimes

I used the official microsoft documentation from here https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu to install .NET and it ran just fine until a few days ago.

EDIT: Upon further investigation, I found out that if I uninstall the SDK I stop getting the error but as soon as I reinstall, it reapears.

asked Jul 24, 2020 at 22:49

Szoke Lorand's user avatar

8

I had this problem using the dotnet installed via snap.
I uninstalled and installed directly, via APT.
Now it works perfectly.
I used the commands from the following link: Dotnet Core

answered Apr 18, 2021 at 0:22

AlexQL's user avatar

On arch (Manjaro GNOME 21.2.5 in my case) installing it with pacman instead of snap fixed it.

First, remove the one installed with snap:

sudo snap remove dotnet-sdk

Then, install it with pacman:

sudo pacman -S dotnet-sdk

answered Apr 16, 2022 at 3:37

Bluesillybeard's user avatar

Apparentyly,because of issues with Snaps, snap installs of Microsoft’s Dotnet packages requires you to do «sudo dotnet…» And doing so just grants you «segmentation fault» without the core dump.

This is as of Dotnet 6.0.108… And the only real reason that I can see running the snapfu version of dotnet is because the package manager version uses libunwind13, and not (the current as of this writing) libunwind14. In my own use case, I can either have a fully functional, non-snapfu’d dotnet, or I can have Discord… but not both. (Ubuntu 22.04)

I was hoping that I had the answer, but I’m still getting the segmentation fault… just without the core dump. I’m thinking that the actual answer is to drop the snap version and use the version from packages.microsoft.com As it doesn’t use libunwind? supposedly and it works. (Once upon a time, I switched from that version the one that comes with ubuntu.)

I’m adding this here because 1) I can’t comment; 2) because down the road, it may help someone else.

answered Sep 2, 2022 at 3:25

CherryCoke's user avatar



  • 0




Добрый день, у меня проблема, когда я ставлю .Net core всё проходит хорошо, но когда я запускаю dotnet new console, то вылазит ошибка «ошибка сегментации», в гугле ничего толкового не нашел, подскажите пожалуйста, что делать в данной ситуации?

.Net core ошибка сегментации

  • Комментарий (0)



  • 0




Опишите подробно процесс установки.
Гугл как раз-таки выдает причину: нехватка оперативной памяти. Часто возникает из-за несовместимых версий библиотек и ПО. Часто эта ошибка встречается в программах на Си или C++.
Самое простое, что можно попробовать, это пересобрать программу из исходников.
Устанавливали по этой инструкции? https://www.microsoft.com/net/core?WT.mc_id=Blog_CENews_Announce_CEA#linuxdebian

А вообще, это скорее вопрос на форум этой программы.
Как вариант, можно попробовать увеличить размер свап, или почистить папку /tmp с помощью утилиты tmpwatch, но скорее всего это программный глюк, при распаковке выходит за доступную область оперативной памяти.

Earlier this evening I installed .NET core preview 2 on Debian Sid, and tried to create a new project via the dotnet new command, only to get a segmention fault error message:

[email protected]:~/git/testproject$ dotnet new console
Segmentation fault

In this instance, the segmentation fault on creation of a new project was is due to .NET Core telemetry being incompatible with version 1.1 of OpenSSL.

A quick check via dpkg shows the current version I have of the OpenSSL package is indeed 1.1

[email protected]:~/git/testproject$ dpkg -s openssl | grep Version
Version: 1.1.0e-1

Setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable disables telemetry.

export DOTNET_CLI_TELEMETRY_OPTOUT=1
[email protected]:~/git/testproject$ dotnet new console
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on /home/zachery/git/testproject/testproject.csproj...
  Restoring packages for /home/zachery/git/testproject/testproject.csproj...
  Generating MSBuild file /home/zachery/git/testproject/obj/testproject.csproj.nuget.g.props.
  Generating MSBuild file /home/zachery/git/testproject/obj/testproject.csproj.nuget.g.targets.
  Restore completed in 219.75 ms for /home/zachery/git/testproject/testproject.csproj.

QED

sey212121

0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

1

ошибка сегментирования стек памяти сброшен на диск, знаю что си и с++ немного отличаются, ну вдруг кто-то подскажет

25.10.2020, 10:13. Показов 6144. Ответов 24

Метки ошибка сегментирования (Все метки)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
int main()
{
int **a;
int n, m, i, j, max, tmp, sum;
scanf ("%d %d", &n, &m);
a = (int**)malloc(n*sizeof(int*));
for (i=0;i<n;i++){
    a[i] = (int*)malloc(m*sizeof(int));
    for (int j=0; j<m; j++){
        printf ("Vvedite elementi matrici [%d][%d]",i ,j);
        scanf ("%d", &a[i][j]); 
    }
}
for (int i = 0;i < n; i++){
    tmp = a[0][j];
    a[0][j] = a[n-1][j];
    a[n-1][j] = tmp;
 
}
for (int i = 0; i<n; i++){
    for (int j = 0; j < m; j++){
        sum = (1-a[i][j]+(a[i][j]*a[i][j]))/6;  
    }
    a[i][0] = 5+sum;
}
max = a[0][0];
for (int i=1; i<n-1; i++){
    for (int j=1; j<m-1; j++){
        if (max<a[i+1][j+1])
        a[i+1][j+1] = max;
    }
}
printf("%d/n", max);
for (i=0; i<n; i++){
free(a[i]);
free(a);
}
return 0;
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



half-horse half-gateway

112 / 79 / 42

Регистрация: 10.05.2016

Сообщений: 517

25.10.2020, 10:22

2

Во-первых, пользуйтесь на форуме тегами «» для оформления кода C++.
Во-вторых, используйте вместо malloc и free операторы new и delete, вместо методов scanf и printf — объекты cin и cout.
В-третьих, заменить #include <math.h> на #include <cmath>.
Всё-таки мы здесь пишем на C++, поэтому лучше использовать то, что он дает.



0



0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

25.10.2020, 10:26

 [ТС]

3

я в курсе, что с++ отличается от си, но мне нужно найти ошибку именно в этом коде на си



0



BlackStoneBlack

half-horse half-gateway

112 / 79 / 42

Регистрация: 10.05.2016

Сообщений: 517

25.10.2020, 10:46

4

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

нужно найти ошибку именно в этом коде на си

Вы попробуйте сделать замену, которую я Вам подсказал. Так более внимательно прошерстите код заодно.

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

for (i=0; i < n; i++){
free(a[i]);
free(a);
}

Меня смущает эта часть кода, например. По логике вещей, оно должно выглядеть так:

C++
1
2
3
4
for (i=0; i < n; i++)
    free(a[i]);
 
free(a);

Т.е. free(a) вынести за цикл.

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

max = a[0][0];
for (int i=1; i<n-1; i++){
    for (int j=1; j<m-1; j++){
        if (max<a[i+1][j+1])
        a[i+1][j+1] = max;
    }
}

Меня также смущает и эта часть кода. Вы уверены, что она делает то, что нужно?



1



0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

25.10.2020, 10:56

 [ТС]

5

все равно ошибка сегментирования стек памяти сброшен на диск

Добавлено через 59 секунд
ну как я подразумевал, то эта часть кода должна найти мне максимальное значение в матрице, после вычисления функции

Добавлено через 15 секунд
ну как я подразумевал, то эта часть кода должна найти мне максимальное значение в матрице, после вычисления функции



0



half-horse half-gateway

112 / 79 / 42

Регистрация: 10.05.2016

Сообщений: 517

25.10.2020, 11:05

6

Цитата
Сообщение от BlackStoneBlack
Посмотреть сообщение

попробуйте сделать замену, которую я Вам подсказал

Сделали? Очевидно, что нет.

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

эта часть кода должна найти мне максимальное значение в матрице, после вычисления функции

Первый столбец и первую строку этот алгоритм явно игнорирует.



0



0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

25.10.2020, 11:11

 [ТС]

7

мне дана функция Si=5+(сигма, где j=от 1 до n)(1-a[i][j]+(a[i][j])^2)/6 i-кол-во строк
по ней я должен подсчитать Si для элементов каждой строки и потом найти в этой матрице наибольший элемент

Добавлено через 5 минут
мне нужно сдать код именно на си, без вкраплений с++, 1 строку он игнорирует, потому что я ее уже сделал максимумом



0



half-horse half-gateway

112 / 79 / 42

Регистрация: 10.05.2016

Сообщений: 517

25.10.2020, 11:15

8

aleksey212121, тогда Вам сразу надо было обратиться в раздел C для начинающих.



0



0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

25.10.2020, 11:19

 [ТС]

9

там людей практически нет, поэтому я подумал здесь попробовать, все таки они довольно похожи, да и проблема одинаковая



0



half-horse half-gateway

112 / 79 / 42

Регистрация: 10.05.2016

Сообщений: 517

25.10.2020, 11:21

10

aleksey212121, ну, здесь рассматриваются решения относительно языка C++ и использовать конструкции malloc/free вместо new/delete есть плохой тон.



0



0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

25.10.2020, 11:23

 [ТС]

11

я понимаю, просто прошу помочь решить проблему, потому что на разделе предназначенном практически не отвечают уже



0



6574 / 4559 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

25.10.2020, 11:52

12

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

я понимаю, просто прошу помочь решить проблему, потому что на разделе предназначенном практически не отвечают уже

Во-первых, это сделал?

Цитата
Сообщение от BlackStoneBlack
Посмотреть сообщение

По логике вещей, оно должно выглядеть так:
C++Выделить код
1
2
3
4
for (i=0; i < n; i++)
    free(a[i]);
free(a);

Во-вторых — вот это что за хрень

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

for (int i = 0;i < n; i++){
    tmp = a[0][j];
    a[0][j] = a[n-1][j];
    a[n-1][j] = tmp;
}

?



0



0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

25.10.2020, 11:54

 [ТС]

13

так, ну то я пробовал, оно никак не изменило ситуацию, вот это нужно чтобы поменять местами 1 и последнюю строки матрицы



0



6574 / 4559 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

25.10.2020, 11:58

14

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

так, ну то я пробовал, оно никак не изменило ситуацию, вот это нужно чтобы поменять местами 1 и последнюю строки матрицы

А чему у тебя тут j равен? Наверное потерял вложенный цикл по j

Добавлено через 1 минуту
И, я не спрашивал изменило ли это ситуация или нет. Вопрос был сделал или нет? Потому что это явная ошибка



0



0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

25.10.2020, 12:06

 [ТС]

15

да сделал

Добавлено через 57 секунд
j у меня равен m, а само количество столбцов в матрице вводится с клавы



0



6574 / 4559 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

25.10.2020, 12:09

16

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

да сделал

А цикл исправил, который я показал?

Добавлено через 32 секунды

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

j у меня равен m, а само количество столбцов в матрице вводится с клавы

j у тебя там вообще не проинициализирован.

Добавлено через 23 секунды
В нём мусор

Добавлено через 1 минуту
И он никак не должен быть равен m, он должен принимать значения [0, m)



0



0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

25.10.2020, 12:10

 [ТС]

17

а как это не проинициализирован, если я его в начале прописал как int



0



6574 / 4559 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

25.10.2020, 12:11

18

Лучший ответ Сообщение было отмечено aleksey212121 как решение

Решение

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

а как это не проинициализирован, если я его в начале прописал как int

Этого недостаточно, надо ещё и какое-то значение присвоить



0



0 / 0 / 0

Регистрация: 04.10.2020

Сообщений: 33

25.10.2020, 12:14

 [ТС]

19

а как этот цикл исправить?
если ты о цикле где я освобождаю а, то да

Добавлено через 2 минуты
получилось!!!!!!
спасибо чувак прям спас



0



oleg-m1973

6574 / 4559 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

25.10.2020, 12:14

20

Цитата
Сообщение от aleksey212121
Посмотреть сообщение

а как этот цикл исправить?

C++
1
2
3
4
5
6
7
//////for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
    {
        tmp = a[0][j];
        a[0][j] = a[n-1][j];
        a[n-1][j] = tmp;
    }



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

25.10.2020, 12:14

20

Не всегда программы в Linux запускаются как положено. Иногда, в силу разных причин программа вместо нормальной работы выдает ошибку. Но нам не нужна ошибка, нам нужна программа, вернее, та функция, которую она должна выполнять. Сегодня мы поговорим об одной из самых серьезных и непонятных ошибок. Это ошибка сегментации Ubuntu. Если такая ошибка происходит только один раз, то на нее можно не обращать внимания, но если это регулярное явление нужно что-то делать.

Конечно, случается эта проблема не только в Ubuntu, а во всех Linux дистрибутивах, поэтому наша инструкция будет актуальна для них тоже. Но сосредоточимся мы в основном на Ubuntu. Рассмотрим что такое ошибка сегментирования linux, почему она возникает, а также как с этим бороться и что делать.

Что такое ошибка сегментации?

Ошибка сегментации, Segmentation fault, или Segfault, или SIGSEGV в Ubuntu и других Unix подобных дистрибутивах, означает ошибку работы с памятью. Когда вы получаете эту ошибку, это значит, что срабатывает системный механизм защиты памяти, потому что программа попыталась получить доступ или записать данные в ту часть памяти, к которой у нее нет прав обращаться.

Чтобы понять почему так происходит, давайте рассмотрим как устроена работа с памятью в Linux, я попытаюсь все упростить, но приблизительно так оно и работает.

Допустим, в вашей системе есть 6 Гигабайт оперативной памяти, каждой программе нужно выделить определенную область, куда будет записана она сама, ее данные и новые данные, которые она будет создавать. Чтобы дать возможность каждой из запущенных программ использовать все шесть гигабайт памяти был придуман механизм виртуального адресного пространства. Создается виртуальное пространство очень большого размера, а из него уже выделяется по 6 Гб для каждой программы. Если интересно, это адресное пространство можно найти в файле /proc/kcore, только не вздумайте никуда его копировать.

Выделенное адресное пространство для программы называется сегментом. Как только программа попытается записать или прочитать данные не из своего сегмента, ядро отправит ей сигнал SIGSEGV и программа завершится с нашей ошибкой. Более того, каждый сегмент поделен на секции, в некоторые из них запись невозможна, другие нельзя выполнять, если программа и тут попытается сделать что-то запрещенное, мы опять получим ошибку сегментации Ubuntu.

Почему возникает ошибка сегментации?

И зачем бы это порядочной программе лезть, куда ей не положено? Да в принципе, незачем. Это происходит из-за ошибки при написании программ или несовместимых версиях библиотек и ПО. Часто эта ошибка встречается в программах на Си или C++. В этом языке программисты могут вручную работать с памятью, а язык со своей стороны не контролирует, чтобы они это делали правильно, поэтому одно неверное обращение к памяти может обрушить программу.

Почему может возникать эта ошибка при несовместимости библиотек? По той же причине — неверному обращению к памяти. Представим, что у нас есть библиотека linux (набор функций), в которой есть функция, которая выполняет определенную задачу. Для работы нашей функции нужны данные, поэтому при вызове ей нужно передать строку. Наша старая версия библиотеки ожидает, что длина строки будет до 256 символов. Но программа была обновлена формат записи поменялся, и теперь она передает библиотеке строку размером 512 символов. Если обновить программу, но оставить старую версию библиотеки, то при передаче такой строки 256 символов запишутся нормально в подготовленное место, а вот вторые 256 перезапишут данные программы, и возможно, попытаются выйти за пределы сегмента, тогда и будет ошибка сегментирования linux.

Что делать если возникла ошибка сегментирования?

Если вы думаете, что это ошибка в программе, то вам остается только отправить отчет об ошибке разработчикам. Но вы все-таки еще можете попытаться что-то сделать.

Например, если падает с ошибкой сегментации неизвестная программа, то мы можем решить что это вина разработчиков, но если с такой ошибкой падает chrome или firefox при запуске возникает вопрос, может мы делаем что-то не так? Ведь это уже хорошо протестированные программы.

Первое, что нужно сделать — это обновить систему до самой последней версии, возможно, был баг и его уже исправили, а может у вас установлены старые версии библиотек и обновление решит проблему. В Ubuntu это делается так:

sudo apt update
sudo apt full-upgrade

Если это не помогло, нужно обнулить настройки программы до значений по умолчанию, возможно, удалить кэш. Настройки программ в Linux обычно содержатся в домашней папке, скрытых подкаталогах с именем программы. Также, настройки и кэш могут содержаться в каталогах ~/.config и ~/.cache. Просто удалите папки программы и попробуйте снова ее запустить. Если и это не помогло, вы можете попробовать полностью удалить программу, а потом снова ее установить, возможно, какие-нибудь зависимости были повреждены:

sudo apt remove пакет_программы
sudo apt autoremove
sudo apt install пакет_программы

Если есть возможность, попробуйте установить программу из другого источника, например, не из PPA, а более старую версию, из официальных репозиториев.

Когда вы все это выполнили, скорее всего, проблема не в вашем дистрибутиве, а в самой программе. Нужно отправлять отчет разработчикам. В Ubuntu это можно сделать с помощью программы apport-bug. Обычно Ubuntu предлагает это сделать сразу, после того как программа завершилась с ошибкой сегментирования. Если же ошибка сегментирования Ubuntu встречается не в системной программе, то вам придется самим искать разработчиков и вручную описывать что произошло.

Чтобы помочь разработчикам решить проблему, недостаточно отправить им только сообщение что вы поймали Segmentation Fault, нужно подробно описать проблему, действия, которые вы выполняли перед этим, так чтобы разработчик мог их воспроизвести. Также, желательно прикрепить к отчету последние функции, которые вызывала программа (стек вызовов функций), это может очень сильно помочь разработчикам.

Рассмотрим, как его получить. Это не так уж сложно. Сначала запустите вашу программу, затем узнайте ее PID с помощью команды:

pgrep программа

Дальше запускаем отладчик gdb:

sudo gdb -q

Подключаемся к программе:

(gdb) attach ваш_pid

После подключения программа станет на паузу, продолжаем ее выполнение командой:

(gdb) continue

segfault

Затем вам осталось только вызвать ошибку:

segfault1

И набрать команду, которая выведет стек последних вызовов:

(gdb) backtrace

Вывод этой команды и нужно отправлять разработчикам. Чтобы отключиться от программы и выйти наберите:

(gdb) detach
(gdb) quit

Дальше остается отправить отчет и ждать исправления ошибки. Если вы не уверены, что ошибка в программе, можете поспрашивать на форумах. Когда у вас есть стек вызовов, уже можно попытаться, если не понять в чем проблема, то попытаться узнать, не сталкивался ли с подобной проблемой еще кто-то.

Выводы

Теперь у вас есть приблизительный план действий, что нужно делать, когда появляется ошибка сегментирования сделан дамп памяти ubuntu. Если вы знаете другие способы решить эту проблему, напишите в комментариях!

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Содержание

  1. Ошибка сегментирования Ubuntu
  2. Что такое ошибка сегментации?
  3. Почему возникает ошибка сегментации?
  4. Что делать если возникла ошибка сегментирования?
  5. Выводы
  6. Оцените статью:
  7. Об авторе
  8. 7 комментариев
  9. Ошибка сегментирования Ubuntu
  10. Что такое ошибка сегментации?
  11. Почему возникает ошибка сегментации?
  12. Что делать если возникла ошибка сегментирования?
  13. Выводы
  14. [проблемы из ниоткуда] ошибка сегментирования. как найти причину?
  15. Segmentation Fault (распределение памяти компьютера)
  16. Немного истории
  17. Совместный доступ к ресурсам
  18. Адресное пространство
  19. Виртуализация памяти
  20. Переадресация
  21. Перераспределение памяти
  22. Сегментация памяти
  23. Совместное использование сегментов
  24. Ограничения сегментации
  25. Разбиение памяти на страницы
  26. Буфер быстрой переадресации (TLB, Translation-lookaside Buffer)

Ошибка сегментирования Ubuntu

Не всегда программы в Linux запускаются как положено. Иногда, в силу разных причин программа вместо нормальной работы выдает ошибку. Но нам не нужна ошибка, нам нужна программа, вернее, та функция, которую она должна выполнять. Сегодня мы поговорим об одной из самых серьезных и непонятных ошибок. Это ошибка сегментации Ubuntu. Если такая ошибка происходит только один раз, то на нее можно не обращать внимания, но если это регулярное явление нужно что-то делать.

Конечно, случается эта проблема не только в Ubuntu, а во всех Linux дистрибутивах, поэтому наша инструкция будет актуальна для них тоже. Но сосредоточимся мы в основном на Ubuntu. Рассмотрим что такое ошибка сегментирования linux, почему она возникает, а также как с этим бороться и что делать.

Что такое ошибка сегментации?

Ошибка сегментации, Segmentation fault, или Segfault, или SIGSEGV в Ubuntu и других Unix подобных дистрибутивах, означает ошибку работы с памятью. Когда вы получаете эту ошибку, это значит, что срабатывает системный механизм защиты памяти, потому что программа попыталась получить доступ или записать данные в ту часть памяти, к которой у нее нет прав обращаться.

Чтобы понять почему так происходит, давайте рассмотрим как устроена работа с памятью в Linux, я попытаюсь все упростить, но приблизительно так оно и работает.

Допустим, в вашей системе есть 6 Гигабайт оперативной памяти, каждой программе нужно выделить определенную область, куда будет записана она сама, ее данные и новые данные, которые она будет создавать. Чтобы дать возможность каждой из запущенных программ использовать все шесть гигабайт памяти был придуман механизм виртуального адресного пространства. Создается виртуальное пространство очень большого размера, а из него уже выделяется по 6 Гб для каждой программы. Если интересно, это адресное пространство можно найти в файле /proc/kcore, только не вздумайте никуда его копировать.

Выделенное адресное пространство для программы называется сегментом. Как только программа попытается записать или прочитать данные не из своего сегмента, ядро отправит ей сигнал SIGSEGV и программа завершится с нашей ошибкой. Более того, каждый сегмент поделен на секции, в некоторые из них запись невозможна, другие нельзя выполнять, если программа и тут попытается сделать что-то запрещенное, мы опять получим ошибку сегментации Ubuntu.

Почему возникает ошибка сегментации?

И зачем бы это порядочной программе лезть, куда ей не положено? Да в принципе, незачем. Это происходит из-за ошибки при написании программ или несовместимых версиях библиотек и ПО. Часто эта ошибка встречается в программах на Си или C++. В этом языке программисты могут вручную работать с памятью, а язык со своей стороны не контролирует, чтобы они это делали правильно, поэтому одно неверное обращение к памяти может обрушить программу.

Что делать если возникла ошибка сегментирования?

Если вы думаете, что это ошибка в программе, то вам остается только отправить отчет об ошибке разработчикам. Но вы все-таки еще можете попытаться что-то сделать.

Например, если падает с ошибкой сегментации неизвестная программа, то мы можем решить что это вина разработчиков, но если с такой ошибкой падает chrome или firefox при запуске возникает вопрос, может мы делаем что-то не так? Ведь это уже хорошо протестированные программы.

sudo apt update
sudo apt full-upgrade

Если это не помогло, нужно обнулить настройки программы до значений по умолчанию, возможно, удалить кэш. Настройки программ в Linux обычно содержатся в домашней папке, скрытых подкаталогах с именем программы. Также, настройки и кэш могут содержаться в каталогах

/.cache. Просто удалите папки программы и попробуйте снова ее запустить. Если и это не помогло, вы можете попробовать полностью удалить программу, а потом снова ее установить, возможно, какие-нибудь зависимости были повреждены:

sudo apt remove пакет_программы
sudo apt autoremove
sudo apt install пакет_программы

Если есть возможность, попробуйте установить программу из другого источника, например, не из PPA, а более старую версию, из официальных репозиториев.

Когда вы все это выполнили, скорее всего, проблема не в вашем дистрибутиве, а в самой программе. Нужно отправлять отчет разработчикам. В Ubuntu это можно сделать с помощью программы apport-bug. Обычно Ubuntu предлагает это сделать сразу, после того как программа завершилась с ошибкой сегментирования. Если же ошибка сегментирования Ubuntu встречается не в системной программе, то вам придется самим искать разработчиков и вручную описывать что произошло.

Чтобы помочь разработчикам решить проблему, недостаточно отправить им только сообщение что вы поймали Segmentation Fault, нужно подробно описать проблему, действия, которые вы выполняли перед этим, так чтобы разработчик мог их воспроизвести. Также, желательно прикрепить к отчету последние функции, которые вызывала программа (стек вызовов функций), это может очень сильно помочь разработчикам.

Рассмотрим, как его получить. Это не так уж сложно. Сначала запустите вашу программу, затем узнайте ее PID с помощью команды:

Дальше запускаем отладчик gdb:

Подключаемся к программе:

(gdb) attach ваш_pid

После подключения программа станет на паузу, продолжаем ее выполнение командой:

segfault

Затем вам осталось только вызвать ошибку:

segfault1

И набрать команду, которая выведет стек последних вызовов:

Вывод этой команды и нужно отправлять разработчикам. Чтобы отключиться от программы и выйти наберите:

(gdb) detach
(gdb) quit

Дальше остается отправить отчет и ждать исправления ошибки. Если вы не уверены, что ошибка в программе, можете поспрашивать на форумах. Когда у вас есть стек вызовов, уже можно попытаться, если не понять в чем проблема, то попытаться узнать, не сталкивался ли с подобной проблемой еще кто-то.

Выводы

Теперь у вас есть приблизительный план действий, что нужно делать, когда появляется ошибка сегментирования сделан дамп памяти ubuntu. Если вы знаете другие способы решить эту проблему, напишите в комментариях!

gedit8

blackscreen2 2

system program Problem detected

resolve5

Оцените статью:

Об авторе

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.

7 комментариев

Спасибо, было очень интересно почитать про отладчик.

На самом деле от этого избавится я не могу. Остаётся мне всё сваливать на свой старый компьютер с 1024 мегабайтами озу. Постоянные ошибки сегментирования когда комплимирую какую-либо программу. Чтобы скомплимировать ядро надо по миллиону раз вводить make!! Щас выкину комп и куплю новый и думаю проблема сама разрешится.

Gentoo. cmake 3.14.6. Segmentation fault.
Xeon 2620 v2 24Gb ram

Проблема сама не решается почему-то. 8-(

С ошибкой SIGSEGV или так называемой ошибкой сегментации(на самом деле это ошибки обращения с памятью) вы ничё не сможете сделать. если вы юзер, а не разработчик и она возникает в вашей проге. можете только одного не запускать эту прогу удалить её или попытаться обновить, возможно(вовсе не обязательно!) её заметили и исправили. Но вообще лицензионное соглашение по Ubuntu вас предупреждает, что вы пользуетесь системой в которой софт вовсе не обязан работать и никто за это не отвечает. вы это делаете на свой страх и риск! это краткий его перевод. А если вы купили операционку заплатили бабки и заказали техподдержку, то вы тогда уже имеете право обратиться в службу тех поддержки сообщить баг, где и как он возникает и они обязаны не просто испавить его прислав патч, но так же всем таким как вы кто заплатил. Иначе вы имеете право подать на них в суд и они обязаны компенсировать вам убытки. Но это не Ubuntu. Обратная сторона медали свободного по и бесплатных операционок. среди Линуксовых есть AIX(только платная+ техподдержка), SUSE(не путать с Open Suse) и Debian(есть free урезаный вариант и нормальный платный). Это оч серьёзная ошибка краеугольный камень всех программ и работы компа в целом. Если это ломается, то всё летит к чёрту. Конечно они стараюстся и сразу посылать вас не будут. Это их репутация! но вообще дело в програмерах. Щаз стало оч много криворуких. Вот я смотрю на их код и удивляюсь, как можно так безалаберно писать проги! Если бы вы только это видели вы бы не удивились почему всё так плохо работает. Встречаются такие кадры которые всё только портят! ну а что програмеров не хаватет, делать надо много вот и берут всех подряд. А потом начинается. Если конечно это заметили до релиза, то ладно. Но тут всё ещё зависит от тестеров. Если они хорошие то найдут баги вовремя до релиза и исправят. но у нас как бывает. Отдела тестирования нет, сэкономили.. Тестер дай бог 2-3 а то часто 1 вообще. В программе всегда много ошибок. Особенно вначале. все мы ошибаемся, особенно некоторые. Причина? Нехватка мозгов или банально невнимательность. поэтому все проги должны быть тщательнейшим образом оттестированы. только тогда она может быть допущена к релизу. А ещё заказчик подгоняет. Хорошую прогу нельзя написать в спешке. тем более большую. Такие ошибки как оч трудно найти, а если она не всегда воспроизводится, так вообще нереально, Если только случайно наткнёшься. Потому что как бывает один раз вылетела, а второй нет и пошла дальше и норм. Или пошла дальше и всё стало неправильным. с програмой начинают твориться чудеса. это всё та же ошибка с памятью, которая всё портит. Вылететь может не только ваша прога но и вся система. Но даже если она стабильно воспроизводится, то на её поиск может понадобиться дни а может и неделя две кропотливой упорной работы, носящей изнуряющий характер. искать будут всем отделом. но её тогда по крайней мере можно найти. а если нет. то вам поможет только чудо. А уж что сделают после этого с тем кто это сделал я даже не знаю! Вот такие вот они эти ошибки сегментации. Я показал то что там происходит за кадром юзера.

У меня появляется такая ошибка при попытке запуска Viber

Источник

Ошибка сегментирования Ubuntu

Не всегда программы в Linux запускаются как положено. Иногда, в силу разных причин программа вместо нормальной работы выдает ошибку. Но нам не нужна ошибка, нам нужна программа, вернее, та функция, которую она должна выполнять. Сегодня мы поговорим об одной из самых серьезных и непонятных ошибок. Это ошибка сегментации Ubuntu. Если такая ошибка происходит только один раз, то на нее можно не обращать внимания, но если это регулярное явление нужно что-то делать.

Конечно, случается эта проблема не только в Ubuntu, а во всех Linux дистрибутивах, поэтому наша инструкция будет актуальна для них тоже. Но сосредоточимся мы в основном на Ubuntu. Рассмотрим что такое ошибка сегментирования linux, почему она возникает, а также как с этим бороться и что делать.

Что такое ошибка сегментации?

Ошибка сегментации, Segmentation fault, или Segfault, или SIGSEGV в Ubuntu и других Unix подобных дистрибутивах, означает ошибку работы с памятью. Когда вы получаете эту ошибку, это значит, что срабатывает системный механизм защиты памяти, потому что программа попыталась получить доступ или записать данные в ту часть памяти, к которой у нее нет прав обращаться.

Чтобы понять почему так происходит, давайте рассмотрим как устроена работа с памятью в Linux, я попытаюсь все упростить, но приблизительно так оно и работает.

Допустим, в вашей системе есть 6 Гигабайт оперативной памяти, каждой программе нужно выделить определенную область, куда будет записана она сама, ее данные и новые данные, которые она будет создавать. Чтобы дать возможность каждой из запущенных программ использовать все шесть гигабайт памяти был придуман механизм виртуального адресного пространства. Создается виртуальное пространство очень большого размера, а из него уже выделяется по 6 Гб для каждой программы. Если интересно, это адресное пространство можно найти в файле /proc/kcore, только не вздумайте никуда его копировать.

Выделенное адресное пространство для программы называется сегментом. Как только программа попытается записать или прочитать данные не из своего сегмента, ядро отправит ей сигнал SIGSEGV и программа завершится с нашей ошибкой. Более того, каждый сегмент поделен на секции, в некоторые из них запись невозможна, другие нельзя выполнять, если программа и тут попытается сделать что-то запрещенное, мы опять получим ошибку сегментации Ubuntu.

Почему возникает ошибка сегментации?

И зачем бы это порядочной программе лезть, куда ей не положено? Да в принципе, незачем. Это происходит из-за ошибки при написании программ или несовместимых версиях библиотек и ПО. Часто эта ошибка встречается в программах на Си или C++. В этом языке программисты могут вручную работать с памятью, а язык со своей стороны не контролирует, чтобы они это делали правильно, поэтому одно неверное обращение к памяти может обрушить программу.

Что делать если возникла ошибка сегментирования?

Если вы думаете, что это ошибка в программе, то вам остается только отправить отчет об ошибке разработчикам. Но вы все-таки еще можете попытаться что-то сделать.

Например, если падает с ошибкой сегментации неизвестная программа, то мы можем решить что это вина разработчиков, но если с такой ошибкой падает chrome или firefox при запуске возникает вопрос, может мы делаем что-то не так? Ведь это уже хорошо протестированные программы.

Если это не помогло, нужно обнулить настройки программы до значений по умолчанию, возможно, удалить кэш. Настройки программ в Linux обычно содержатся в домашней папке, скрытых подкаталогах с именем программы. Также, настройки и кэш могут содержаться в каталогах

/.cache. Просто удалите папки программы и попробуйте снова ее запустить. Если и это не помогло, вы можете попробовать полностью удалить программу, а потом снова ее установить, возможно, какие-нибудь зависимости были повреждены:

Если есть возможность, попробуйте установить программу из другого источника, например, не из PPA, а более старую версию, из официальных репозиториев.

Когда вы все это выполнили, скорее всего, проблема не в вашем дистрибутиве, а в самой программе. Нужно отправлять отчет разработчикам. В Ubuntu это можно сделать с помощью программы apport-bug. Обычно Ubuntu предлагает это сделать сразу, после того как программа завершилась с ошибкой сегментирования. Если же ошибка сегментирования Ubuntu встречается не в системной программе, то вам придется самим искать разработчиков и вручную описывать что произошло.

Чтобы помочь разработчикам решить проблему, недостаточно отправить им только сообщение что вы поймали Segmentation Fault, нужно подробно описать проблему, действия, которые вы выполняли перед этим, так чтобы разработчик мог их воспроизвести. Также, желательно прикрепить к отчету последние функции, которые вызывала программа (стек вызовов функций), это может очень сильно помочь разработчикам.

Рассмотрим, как его получить. Это не так уж сложно. Сначала запустите вашу программу, затем узнайте ее PID с помощью команды:

Дальше запускаем отладчик gdb:

Подключаемся к программе:

После подключения программа станет на паузу, продолжаем ее выполнение командой:

oshibka segmentirovanija ubuntu 1

Затем вам осталось только вызвать ошибку:

oshibka segmentirovanija ubuntu 2

И набрать команду, которая выведет стек последних вызовов:

Вывод этой команды и нужно отправлять разработчикам. Чтобы отключиться от программы и выйти наберите:

Дальше остается отправить отчет и ждать исправления ошибки. Если вы не уверены, что ошибка в программе, можете поспрашивать на форумах. Когда у вас есть стек вызовов, уже можно попытаться, если не понять в чем проблема, то попытаться узнать, не сталкивался ли с подобной проблемой еще кто-то.

Выводы

Теперь у вас есть приблизительный план действий, что нужно делать, когда появляется ошибка сегментирования сделан дамп памяти ubuntu. Если вы знаете другие способы решить эту проблему, напишите в комментариях!

Источник

[проблемы из ниоткуда] ошибка сегментирования. как найти причину?

полагаю что дело в том что утром были найдены ошибки в файловой системе

то есть вроде бы читает файл и после этого падает. но толку.. ltrace вообще ничего не дал. похоже ошибка происходит непосредственно в коде программы ssh. ещё вчера всё работало..

56076:1404038575

1) Посмотри, нет ли записей о сегфолтах в messages.
2) Попробуй временно переименовать

34387: 474426391

ltrace ssh svn-server

23359:317419500

Ну явно же написано, что у тебя known_hosts покоцан. Сдвинь его в сторонку и не парься.

40790:481586867

Но таки программа не должна падать из-за проблемы в каком-то конфиге.

благодарю за толковые советы

не, я ж написал, ltrace ничего не дал:

да, кстати, вряд ли.. но я тем не менее сдвинул его.. не помогло..

можно ли как-то запустить проверку контрольных сумм всех файлов установленных пакетным менеджером?

Запустить под gdb и посмотреть почему упало.

25540:527665789

17727:1795121613

34387: 474426391

>не, я ж написал, ltrace ничего не дал:

strace ssh svn-server

chkrootkit и rkhunter попробуй

и работал вчера ssh

ну и странно что на одном и том же месте.. скорее уж с диском проблемы..

мужик, я думаю специально для тебя нужно ввести звание Ъ^2.

23359:317419500

Где,ж он на ровном месте? Какова вероятность, что при многочисленных попытках считать файл он всегда будет попадать на битую область?

23359:317419500

> ну и странно что на одном и том же месте..

87623: 1228661212

У меня эта штука половину портов засосала. 1111 А дело всё было в слоте памяти на материнке. И memtest86+ молчал.

libc переставь и tls и прочие либы, которыми пользуется ssh. переустановка только ssh не приведет к переустановке этих либ

Хехе. вероятная причина кроется в svn.

Сам лично сталкивался с регулярными падениями СВН составляющих в дебе. Как правило это происходило при попытке СВНа обратиться в дбасу. Но и в других ситуациях тоже, но реже.

23359:317419500

> Хехе. вероятная причина кроется в svn.

open(«/home/andrey/.ssh/known_hosts», O_RDONLY) = 4 ★ ( 26.09.11 14:35:24 )

p

read() отработал нормально. Проблема где-то доальше в коде. Надо gdb.

Ага, я тоже сидел с gdb и дебажил почему svn up падает 🙂 Проблема была глубоко-глубоко 🙂 А на деле все оказалось куда проще.

23359:317419500

Там цикл чтения по 4096. Еслибы он отработал нормально, мы бы увидели следующую итерацию (размер файла больше).

34387: 474426391

memtest’ом можно подтереться только. Инфа 100%.

Для таких вещей есть ключ для дебага. И gdb. И ещё strace.

А ещё подумай о том, что повреждение может быть в какой-то либе, которую он загружает.

Источник

Segmentation Fault (распределение памяти компьютера)

2254da58f07d4d69b4733304c85989e2

Когда я делаю ошибку в коде, то обычно это приводит к появлению сообщения “segmentation fault”, зачастую сокращённого до “segfault”. И тут же мои коллеги и руководство приходят ко мне: «Ха! У нас тут для тебя есть segfault для исправления!» — «Ну да, виноват», — обычно отвечаю я. Но многие ли из вас знают, что на самом деле означает ошибка “segmentation fault”?

Чтобы ответить на этот вопрос, нам нужно вернуться в далёкие 1960-е. Я хочу объяснить, как работает компьютер, а точнее — как в современных компьютерах осуществляется доступ к памяти. Это поможет понять, откуда же берётся это странное сообщение об ошибке.

Вся представленная ниже информация — основы компьютерной архитектуры. И без нужды я не буду сильно углубляться в эту область. Также я буду применять всем известную терминологию, так что мой пост будет понятен всем, кто не совсем на «вы» с вычислительной техникой. Если же вы захотите изучить вопрос работы с памятью подробнее, то можете обратиться к многочисленной доступной литературе. А заодно не забудьте покопаться в исходном коде ядра какой-нибудь ОС, например, Linux. Я не буду излагать здесь историю вычислительной техники, некоторые вещи не будут освещаться, а некоторые сильно упрощены.

Немного истории

image loader

То есть на ОС приходилась, скажем, четверть всей доступной памяти, а остальной объём отдавался под пользовательские задачи. В то время роль ОС заключалась в простом управлении оборудованием с помощью прерываний ЦПУ. Так что операционке нужна была память для себя, для копирования данных с устройств и для работы с ними (режим PIO). Для вывода данных на экран нужно было использовать часть основной памяти, ведь видеоподсистема либо не имела своей оперативки, либо обладала считанными килобайтами. А уже сама программа выполнялась в области памяти, идущей сразу после ОС, и решала свои задачи.

Совместный доступ к ресурсам

Из-за непомерной стоимости мало кто мог позволить себе приобрести сразу несколько компьютеров, чтобы обрабатывать одновременно несколько задач. Поэтому люди начали искать способы совместного доступа к вычислительным ресурсам одного компьютера. Так наступила эра многозадачности. Обратите внимание, что в те времена ещё никто не помышлял о многопроцессорных компьютерах. Так как же можно заставить компьютер с одним ЦПУ выполнять несколько разных задач?

Решением стало использование планировщика задач (scheduling): пока один процесс прерывался, ожидая завершения операций ввода/вывода, ЦПУ мог выполнять другой процесс. Я не буду здесь больше касаться планировщика задач, это слишком обширная тема, не имеющая отношения к памяти.

Если компьютер способен поочерёдно выполнять несколько задач, то распределение памяти будет выглядеть примерно так:

image loader

Задачи А и В хранятся в памяти, поскольку копировать их на диск и обратно слишком затратно. И по мере того, как процессор выполняет ту или иную задачу, он обращается к памяти за соответствующими данными. Но тут возникает проблема.

Когда один программист будет писать код для выполнения задачи В, он должен знать границы выделяемых сегментов памяти. Допустим, задача В занимает в памяти отрезок от 10 до 12 Кб, тогда каждый адрес памяти должен быть жёстко закодирован в пределах этих границ. Но если компьютер будет выполнять сразу три задачи, то память будет поделена на большее количество сегментов, и значит сегмент для задачи В может оказаться сдвинут. Тогда код программы придётся переписывать, чтобы она могла оперировать меньшим объёмом памяти, а также изменить все указатели.

Здесь всплывает и иная проблема: что если задача В обратится к сегменту памяти, выделенному для задачи А? Такое легко может произойти, ведь при работе с указателями памяти достаточно сделать маленькую ошибку, и программа будет обращаться к совершенно другому адресу, нарушив целостность данных другого процесса. При этом задача А может работать с очень важными с точки зрения безопасности данными. Нет никакого способа помешать В вторгнуться в область памяти А. Наконец, вследствие ошибки программиста задача В может перезаписать область памяти ОС (в данном случае от 0 до 4 Кб).

Адресное пространство

Чтобы можно было спокойно выполнять несколько задач, хранящихся в памяти, нам нужна помощь от ОС и оборудования. В частности, адресное пространство. Это некая абстракция памяти, выделяемая ОС для какого-то процесса. На сегодняшний день это фундаментальная концепция, которая используется везде. По крайней мере, во ВСЕХ компьютерах гражданского назначения принят именно этот подход, а у военных могут быть свои секреты. Персоналки, смартфоны, телевизоры, игровые приставки, умные часы, банкоматы — ткните в любой аппарат, и окажется, что распределение памяти в нём осуществляется по принципу «код-стек-куча» (code-stack-heap).

Адресное пространство содержит всё, что нужно для выполнения процесса:

image loader

Виртуализация памяти

Допустим, задача А получила в своё распоряжение всю доступную пользовательскую память. И тут возникает задача В. Как быть? Решение было найдено в виртуализации.

Напомню одну из предыдущих иллюстраций, когда в памяти одновременно находятся А и В:

image loader

Допустим, А пытается получить доступ к памяти в собственном адресном пространстве, например по индексу 11 Кб. Возможно даже, что это будет её собственный стек. В этом случае ОС нужно придумать, как не подгружать индекс 1500, поскольку по факту он может указывать на область задачи В.

На самом деле, адресное пространство, которое каждая программа считает своей памятью, является памятью виртуальной. Фальшивкой. И в области памяти задачи А индекс 11 Кб будет фальшивым адресом. То есть — адресом виртуальной памяти.

Каждая программа, выполняющаяся на компьютере, работает с фальшивой (виртуальной) памятью. С помощью некоторых чипов ОС обманывает процесс, когда он обращается к какой-либо области памяти. Благодаря виртуализации ни один процесс не может получить доступ к памяти, которая ему не принадлежит: задача А не влезет в память задачи В или самой ОС. При этом на пользовательском уровне всё абсолютно прозрачно, благодаря обширному и сложному коду ядра ОС.

Таким образом, каждое обращение к памяти регулируется операционной системой. И это должно осуществляться очень эффективно, чтобы не слишком замедлять работу различных выполняющихся программ. Эффективность обеспечивается с помощью аппаратных средств, преимущественно — ЦПУ и некоторых компонентов вроде MMU. Последний появился в виде отдельного чипа в начале 1970-х, а сегодня MMU встраиваются непосредственно в процессор и в обязательном порядке используются операционными системами.

Вот небольшая программка на С, демонстрирующая работу с адресами памяти:

На моей машине LP64 X86_64 она показывает такой результат:

Code is at 0x40054c
Stack is at 0x7ffe60a1465c
Heap is at 0x1ecf010

Как я и описывал, сначала идёт кодовый сегмент, затем куча, а затем стек. Но все эти три адреса фальшивые. В физической памяти по адресу 0x7ffe60a1465c вовсе не хранится целочисленная переменная со значением 3. Никогда не забывайте, что все пользовательские программы манипулируют виртуальными адресами, и только на уровне ядра или аппаратных драйверов допускается использование адресов физической памяти.

Переадресация

Переадресация (транслирование, перевод, преобразование адресов) — это термин, обозначающий процесс сопоставления виртуального адреса физическому. Занимается этим модуль MMU. Для каждого выполняющегося процесса операционка должна помнить соответствия всех виртуальных адресов физическим. И это довольно непростая задача. По сути, ОС приходится управлять памятью каждого пользовательского процесса при каждом обращении. Тем самым она превращает кошмарную реальность физической памяти в полезную, мощную и лёгкую в использовании абстракцию.

Давайте рассмотрим подробнее.

Итак, это виртуальное адресное пространство:

image loader

А это его физический образ:

image loader

Физический адрес = виртуальный адрес + base

Если получившийся физический адрес (6 Кб) выбивается из границ выделенной области (4—20 Кб), это означает, что процесс пытается обратиться к памяти, которая ему не принадлежит. Тогда ЦПУ генерирует исключение и сообщает об этом ОС, которая обрабатывает данное исключение. В этом случае система обычно сигнализирует процессу о нарушении: SIGSEGV, Segmentation Fault. Этот сигнал по умолчанию прерывает выполнение процесса (это можно настраивать).

Перераспределение памяти

Если задача А исключена из очереди на выполнение, то это даже лучше. Это означает, что планировщик попросили выполнить другую задачу (допустим, В). Пока выполняется В, операционка может перераспределить всё физическое пространство задачи А. Во время выполнения пользовательского процесса ОС зачастую теряет управление процессором. Но когда процесс делает системный вызов, процессор снова возвращается под контроль ОС. До этого системного вызова операционка может что угодно делать с памятью, в том числе и целиком перераспределять адресное пространство процесса в другой физический раздел.

В нашем примере это осуществляется достаточно просто: ОС перемещает 16-килобайтную область в другое свободное место подходящего размера и просто обновляет значения переменных base и bounds для задачи А. Когда процессор возвращается к её выполнению, процесс переадресации всё ещё работает, но физическое адресное пространство уже изменилось.

С точки зрения задачи А ничего не меняется, её собственное адресное пространство по-прежнему расположено в диапазоне 0-16 Кб. При этом ОС и MMU полностью контролируют каждое обращение задачи к памяти. То есть программист манипулирует виртуальной областью 0-16 Кб, а MMU берёт на себя сопоставление с физическими адресами.

После перераспределения образ памяти будет выглядеть так:

image loader

Программисту теперь не нужно заботиться о том, с какими адресами памяти будет работать его программа, не нужно переживать о конфликтах. ОС в связке с MMU снимают с него все эти заботы.

Сегментация памяти

В предыдущих главах мы рассмотрели вопросы переадресации и перераспределения памяти. Однако у нашей модели работы с памятью есть ряд недостатков:

Для решения некоторых из этих проблем давайте рассмотрим более сложную систему организации памяти — сегментацию. Смысл её прост: принцип “base and bounds” распространяется на все три сегмента памяти — кучу, кодовый сегмент и стек, причём для каждого процесса, вместо того чтобы рассматривать образ памяти как единую уникальную сущность.

В результате мы больше не теряем память между стеком и кучей:

image loader

Допустим, у кучи задачи А параметр base равен 126 Кб, а bounds — 2 Кб. Пусть задача А обращается к виртуальному адресу 3 Кб (в куче). Тогда физический адрес определяется как 3 – 2 Кб (начало кучи) = 1 Кб + 126 Кб (сдвиг) = 127 Кб. Это меньше 128, а значит ошибки обращения не будет.

Совместное использование сегментов

Сегментирование физической памяти не только не позволяет виртуальной памяти отъедать физическую, но также даёт возможность совместного использования физических сегментов с помощью виртуальных адресных пространств разных процессов.

Если дважды запустить задачу А, то кодовый сегмент у них будет один и тот же: в обеих задачах выполняются одинаковые машинные инструкции. В то же время у каждой задачи будут свои стек и куча, поскольку они оперируют разными наборами данных.

image loader

При этом оба процесса не подозревают, что делят с кем-то свою память. Такой подход стал возможен благодаря внедрению битов защиты сегмента (segment protection bits).

Поскольку сам код нельзя модифицировать, то все кодовые сегменты создаются с флагами RX. Это значит, что процесс может загружать эту область памяти для последующего выполнения, но в неё никто не может записывать. Другие два сегмента — куча и стек — имеют флаги RW, то есть процесс может считывать и записывать в эти свои два сегмента, однако код из них выполнять нельзя. Это сделано для обеспечения безопасности, чтобы злоумышленник не мог повредить кучу или стек, внедрив в них свой код для получения root-прав. Так было не всегда, и для высокой эффективности этого решения требуется аппаратная поддержка. В процессорах Intel это называется “NX bit”.

Флаги могут быть изменены в процессе выполнения программы, для этого используется mprotect().

Под Linux все эти сегменты памяти можно посмотреть с помощью утилит /proc//maps или /usr/bin/pmap.

Здесь есть все необходимые подробности относительно распределения памяти. Адреса виртуальные, отображаются разрешения для каждой области памяти. Каждый совместно используемый объект (.so) размещён в адресном пространстве в виде нескольких частей (обычно код и данные). Кодовые сегменты являются исполняемыми и совместно используются в физической памяти всеми процессами, которые разместили подобный совместно используемый объект в своём адресном пространстве.

Shared Objects — это одно из крупнейших преимуществ Unix- и Linux-систем, обеспечивающее экономию памяти.

Также с помощью системного вызова mmap() можно создавать совместно используемую область, которая преобразуется в совместно используемый физический сегмент. Тогда у каждой области появится индекс s, означающий shared.

Ограничения сегментации

Итак, сегментация позволила решить проблему неиспользуемой виртуальной памяти. Если она не используется, то и не размещается в физической памяти благодаря использованию сегментов, соответствующих именно объёму используемой памяти.

Но это не совсем верно.

Допустим, процесс запросил у кучи 16 Кб. Скорее всего, ОС создаст в физической памяти сегмент соответствующего размера. Если пользователь потом освободит из них 2 Кб, тогда ОС придётся уменьшить размер сегмента до 14 Кб. Но вдруг потом программист запросит у кучи ещё 30 Кб? Тогда предыдущий сегмент нужно увеличить более чем в два раза, а возможно ли это будет сделать? Может быть, его уже окружают другие сегменты, не позволяющие ему увеличиться. Тогда ОС придётся искать свободное место на 30 Кб и перераспределять сегмент.

image loader

Главный недостаток сегментов заключается в том, что из-за них физическая память сильно фрагментируется, поскольку сегменты увеличиваются и уменьшаются по мере того, как пользовательские процессы запрашивают и освобождают память. А ОС приходится поддерживать список свободных участков и управлять ими.

Фрагментация может привести к тому, что какой-нибудь процесс запросит такой объём памяти, который будет больше любого из свободных участков. И в этом случае ОС придётся отказать процессу в выделении памяти, даже если суммарный объём свободных областей будет существенно больше.

ОС может попытаться разместить данные компактнее, объединяя все свободные области в один большой чанк, который в дальнейшем можно использовать для нужд новых процессов и перераспределения.

image loader

Но подобные алгоритмы оптимизации сильно нагружают процессор, а ведь его мощности нужны для выполнения пользовательских процессов. Если ОС начинает реорганизовывать физическую память, то система становится недоступной.

Так что сегментация памяти влечёт за собой немало проблем, связанных с управлением памятью и многозадачностью. Нужно как-то улучшить возможности сегментации и исправить недостатки. Это достигается с помощью ещё одного подхода — страниц виртуальной памяти.

Разбиение памяти на страницы

Как было сказано выше, главный недостаток сегментации заключается в том, что сегменты очень часто меняют свой размер, и это приводит к фрагментации памяти, из-за чего может возникнуть ситуация, когда ОС не выделит для процессов нужные области памяти. Эта проблема решается с помощью страниц: каждое размещение, которое ядро делает в физической памяти, имеет фиксированный размер. То есть страницы — это области физической памяти фиксированного размера, ничего более. Это сильно облегчает задачу управления свободным объёмом и избавляет от фрагментации.

Давайте рассмотрим пример: виртуальное адресное пространство объёмом 16 Кб разбито на страницы.

image loader

Мы не говорим здесь о куче, стеке или кодовом сегменте. Просто делим память на куски по 4 Кб. Затем то же самое делаем с физической памятью:

image loader

ОС хранит таблицу страниц процесса (process page table), в которой представлены взаимосвязи между страницей виртуальной памяти процесса и страницей физической памяти (страничный кадр, page frame).

image loader

Теперь мы избавились от проблемы поиска свободного места: страничный кадр либо используется, либо нет (unused). И ядру не в пример легче найти достаточное количество страниц, чтобы выполнить запрос процесса на выделение памяти.

Страница — это мельчайшая и неделимая единица памяти, которой может оперировать ОС.

У каждого процесса есть своя таблица страниц, в которой представлена переадресация. Здесь уже используются не значения границ области, а номер виртуальной страницы (VPN, virtual page number) и сдвиг (offset).

Пример: размер виртуального пространства 16 Кб, следовательно, нам нужно 14 бит для описания адресов (2 14 = 16 Кб). Размер страницы 4 Кб, значит нам нужно 4 Кб (16/4), чтобы выбрать нужную страницу:

image loader

Когда процесс хочет использовать, например, адрес 9438 (вне границ 16 384), то он запрашивает в двоичном коде 10.0100.1101.1110:

image loader

Это 1246-й байт в виртуальной странице номер 2 («0100.1101.1110»-й байт в «10»-й странице). Теперь ОС достаточно просто обратиться к таблице страниц процесса, чтобы найти эту страницу номер 2. В нашем примере она соответствует восьмитысячному байту физической памяти. Следовательно, виртуальный адрес 9438 соответствует физическому адресу 9442 (8000 + сдвиг 1246).

Как уже было сказано, каждый процесс обладает лишь одной таблицей страниц, поскольку у каждого процесса собственная переадресация, как и у сегментов. Но где же именно хранятся все эти таблицы? Наверное, в физической памяти, где же ещё им быть?

Если сами таблицы страниц хранятся в памяти, то для получения VPN надо обращаться к памяти. Тогда количество обращений к ней удваивается: сначала мы извлекаем из памяти номер нужной страницы, а затем обращаемся к самим данным, хранящимся в этой странице. И если скорость доступа к памяти невелика, то ситуация выглядит довольно грустно.

Буфер быстрой переадресации (TLB, Translation-lookaside Buffer)

Использование страниц в качестве основного инструмента поддержки виртуальной памяти может привести к сильному снижению производительности. Разбиение адресного пространства на небольшие куски (страницы) требует хранения большого количества данных о размещении страниц. А раз эти данные хранятся в памяти, то при каждом обращении процесса к памяти осуществляется ещё одно, дополнительное обращение.

Для поддержания производительности снова используется помощь оборудования. Как и при сегментации, мы аппаратными методами помогаем ядру эффективно осуществлять переадресацию. Для этого используется TLB, входящий в состав MMU, и представляющий собой простой кэш для некоторых VPN-переадресаций. TLB позволяет ОС не обращаться к памяти лишний раз, чтобы получить физический адрес из виртуального.

Аппаратный MMU инициируется при каждом обращении к памяти, извлекает из виртуального адреса VPN и запрашивает у TLB, хранится ли в нём переадресация с этого VPN. Если да, то его роль выполнена. Если нет, то MMU находит нужную таблицу страниц процесса, и если она ссылается на валидный адрес, то обновляет данные в TLB, чтобы тот предоставлял их при следующем обращении.

Как вы понимаете, если в кэше отсутствует нужная переадресация, то это замедляет обращение к памяти. Можно предположить, что чем больше размер страниц, тем больше вероятность, что в TLB окажутся нужные данные. Но тогда мы будем тратить больше памяти на каждую страницу. Так что здесь нужен какой-то компромисс. Современные ядра умеют использовать страницы разных размеров. Например, Linux способен оперировать «огромными» страницами по 2 Мб вместо традиционных 4 Кб.

Также рекомендуется хранить данные компактно, в смежных адресах памяти. Если вы раскидаете их по всей памяти, то куда чаще в TLB не будет обнаруживаться нужной переадресации, либо он будет постоянно переполняться. Это называется эффективностью пространственной локальности (spacial locality efficiency): данные, которые расположены в памяти сразу за вашими, могут размещаться в той же физической странице, и тогда благодаря TLB вы получите выигрыш в производительности.

Кроме того, TLB в каждой записи хранит так называемые ASID (Address Space Identifier, идентификатор адресного пространства). Это нечто вроде PID, идентификатора процесса. Каждый процесс, поставленный в очередь на выполнение, имеет собственный ASID, и TLB может управлять обращением любого процесса к памяти, без риска ошибочных обращений со стороны других процессов.

Повторимся снова: если пользовательский процесс пытается обратиться к неправильному адресу, тот наверняка будет отсутствовать в TLB. Следовательно, будет запущена процедура поиска в таблице страниц процесса. В ней хранится переадресация, но с неправильным набором битов. В х86-системах переадресации имеют размер 4 Кб, то есть битов в них немало. А значит есть вероятность найти правильный бит, равно как и другие вещи, наподобие бита изменения («грязного бита», dirty bit), битов защиты (protection bit), бита обращения (reference bit) и т.д. И если запись помечена как неправильная, то ОС по умолчанию выдаст SIGSEGV, что приведёт к ошибке “segmentation fault”, даже если о сегментах уже и речи не идёт.

На самом деле разбиение памяти на страницы в современных ОС устроено куда сложнее, чем я расписал. В частности, используются многоуровневые записи в таблицах страниц, многостраничные размеры, вытеснение страниц (page eviction), также известное как «обмен» (ядро скидывает страницы из памяти на диск и обратно, что повышает эффективность использования основной памяти и создаёт у процессов иллюзию её неограниченности).

Источник

Я следую https://dotnet.microsoft.com/learn/dotnet/ привет-мир-учебник/создать

Когда я пытаюсь создать проект, я получаю следующее:

oskar@oskarslaptop:~/Programming/Resorvoir-CLI$ dotnet new console -o MyApp
Segmentation fault (core dumped)

Я установил dotnet 5.0 с помощью оснастки, используя:

sudo snap install dotnet-sdk --classic --channel=5.0
sudo snap alias dotnet-sdk.dotnet dotnet

Информация о снимках:

oskar@oskarslaptop:~/Programming/Resorvoir-CLI$ sudo snap info dotnet-sdk 
name:      dotnet-sdk
summary:   Develop high performance applications in less time, on any platform.
publisher: Microsoft .NET Core (dotnetcore✓)
store-url: https://snapcraft.io/dotnet-sdk
contact:   https://dot.net/core
license:   unset
description: |
  .NET Core is the modular and high performance implementation of .NET for creating web applications
  and services that run on Windows, Linux and Mac. It is open source and it can share the same code
  with .NET Framework and Xamarin apps.
  
  .NET Core is a .NET Foundation project. https://dotnetfoundation.org/
commands:
  - dotnet-sdk.dotnet
snap-id:      uHc4y9lWxyqYfxsqcr4xILzAai4L1BHs
tracking:     5.0/stable
refresh-date: today at 13:36 BST
channels:
  latest/stable:    5.0.302                   2021-07-13 (132) 139MB classic
  latest/candidate: ↑                                                
  latest/beta:      ↑                                                
  latest/edge:      5.0.202                   2021-04-16 (120) 137MB classic
  lts/stable:       3.1.411                   2021-07-13 (133) 123MB classic
  lts/candidate:    ↑                                                
  lts/beta:         ↑                                                
  lts/edge:         ↑                                                
  6.0/stable:       –                                                
  6.0/candidate:    –                                                
  6.0/beta:         6.0.100-preview.6.21355.2 2021-07-14 (134) 144MB classic
  6.0/edge:         ↑                                                
  5.0/stable:       5.0.302                   2021-07-13 (132) 139MB classic
  5.0/candidate:    ↑                                                
  5.0/beta:         5.0.100                   2020-11-10 (105) 267MB classic
  5.0/edge:         ↑                                                
  3.1/stable:       3.1.411                   2021-07-13 (133) 123MB classic
  3.1/candidate:    ↑                                                
  3.1/beta:         ↑                                                
  3.1/edge:         ↑                                                
  2.1/stable:       2.1.816                   2021-05-11 (124) 245MB classic
  2.1/candidate:    ↑                                                
  2.1/beta:         ↑                                                
  2.1/edge:         2.1.808                   2020-07-14  (91) 245MB classic
installed:          5.0.302                              (132) 139MB classic

My System (I can't embed images)

4 ответа

Лучший ответ

ОС POP основана на Ubuntu. Если вы установили среду выполнения dotnet с помощью моментальной установки, вы можете получить к ней доступ только через «sudo dotnet …». У меня была такая же проблема в VS Code, он запускает команды dotnet без sudo, и я получил ошибку «Ошибка сегментации (сброс ядра)». Я решил, установив среду выполнения dotnet через apt-get (теперь она устанавливается в «/usr/bin…» и работает без sudo (см.: https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004- ))


6

Danut Radoaica
4 Ноя 2021 в 18:53

Я думаю, что это проблема сама по себе. Вместо snap используйте pacman

sudo snap remove dotnet-sdk
sudo pacman -S dotnet-sdk

Подробнее об этой проблеме здесь https://github.com/dotnet/sdk/issues/11639


5

Amit Kotha
25 Июл 2021 в 17:52

Я получаю «Ошибка сегментации (сброс ядра)» с .Net 6.0 (сборка dotnet) в Ubuntu 22.04. После перехода на Ubuntu 20.04. «сборка dotnet» работает хорошо


1

user2219822
28 Апр 2022 в 12:51

7.0.100-preview.5.22307.18 работал у меня в Ubuntu 22.04, когда я загружал файл gzip, извлекал его в папку и вызывал расположение папки из командной строки.


0

William
16 Июн 2022 в 17:12

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Dota 2 ошибка записи на диск appmanifest
  • Dr web cureit ошибка лечения что делать