Strace: ОШИБКИ в доступе [закрыто]

Во-первых, большое спасибо г-ну Sujal ( https://stackoverflow.com/users/1279790/sujal) для его справки на сообществе Разногласий.

решение было довольно просто.

Это включает не выбор "jre" папки (/.... oracle-java-8-jdk/jre), но вместо этого выбор jdk папки один уровень выше его.

, В целом, очень простая фиксация, даже если потребовался час для выяснения.

Большое спасибо ему снова, и в то время как он говорит, он никогда не использует Переполнение стека, я надеюсь, что он узнает, насколько я ценю его справку.

1
задан 15.04.2020, 01:54

1 ответ

Тот факт, что ваша программа вызывает brk(2) так много раз (8843), заставляет меня думать, что ваш код запрашивает слишком много памяти из системы. И вообще, в Linux, когда программа запрашивает слишком много памяти, она уничтожается с помощью SIGKILL.

Подробнее

brk(2) - это один из двух способов, которыми программа должна запрашивать память. Другой способ - mmap(2). Реализации malloc(3) и друзей, предлагаемые библиотекой GNU C, используют комбинацию из двух.

Вообще говоря, как бы ваша программа ни выделяла память, Linux не жалуется. Даже если памяти нет, вполне возможно, что ядро ​​все еще возвращает действительные адреса.

Это потому, что Linux распределяет память лениво , в том смысле, что память не «физически выделяется», пока вы не начнете ее использовать. Это отличная оптимизация производительности.

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

О доступе

Вы отметили, что strace -c сообщает о 4 access(2) сбоях. Это, безусловно, не является признаком проблемы. Это нормально для системного вызова сбой. Проблемы возникают, когда ваша программа не обрабатывает сбои.

Пример:

$ strace -e trace=stat -- ls /abc 
stat("/abc", 0x1df2e30)                 = -1 ENOENT (No such file or directory)
ls: cannot access /abc: No such file or directory
+++ exited with 2 +++

Я сказал ls перечислить содержимое несуществующего каталога (/abc), поэтому вызов stat(2) не удался с ENOENT ]. Это не проблема для самого ls: он обнаружил сбой и отобразил сообщение об ошибке.

Проблемы возникли бы, если бы ls не проверял возвращаемое значение stat(2).

О вашей конкретной проблеме: Трудно понять, почему произошел сбой доступа. Вывод strace -e trace=access или strace -C даст вам несколько попаданий. Однако я твердо верю, что такие сбои для вас не проблема, поскольку они, вероятно, взяты из библиотеки GNU C:

$ strace -e trace=access -- ls
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
...
0
ответ дан 15.04.2020, 01:55

Теги

Похожие вопросы