Stack underflow ошибка печати

Я действительно изо всех сил пытаюсь решить стек underflow, который я получаю. Трассировка, которую я получаю во время выполнения:

VerifyError: Error #1024: Stack underflow occurred.

at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()

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

есть ли у кого-нибудь советы по отладке стека Underflow? Есть ли четкое объяснение того, что это означает для Flash?

в случае, если это помогает, эта ошибка происходит, когда я нажимаю кнопку, обработчик которой делает вызов RPC, который использует URLLoader, AsyncToken, а затем вызывает набор экземпляров AsyncResponder, связанных с AsyncToken. С некоторыми серверными журналами, а также некоторыми журналами, взломанными в swf, я знаю, что UrlLoader успешно выполняет и получает crossdomain.xml-файл, правильно его обрабатывает (т. е.: если я его разрушу, я получу ошибку безопасности), а также успешно завершает запрос «load» (сервер отправляет данные.) Кажется, что в этом случае происходит утечка.Полный процесс прослушивания/обработки (как, конечно, подразумевается и обратной трассировкой).

mxmlc используется = из flex_sdk_4.5.0.20967

пример игрока (я пробовал несколько) = 10.2.153.1


обновление: моя конкретная проблема решается… но я оставляю вопрос как есть, так как я хотел бы знать, как обычно отлаживать такую проблему, а не просто получать мои конкретные решение.

в моем коде у меня было следующее определение приложения:

<s:Application height="100%" width="100%"
                              xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               initialize="InitData();">

обратите внимание, что код / был прикреплен к initialize событие.

InitData () и соответствующие определения:

import classes.RpcServerProxy;
public var SP:RpcServerProxy;

public function InitData():void {
    SP = new RpcServerProxy("http://192.168.1.102:1234");
}

когда я переключил вызов InitData (), чтобы быть на onCompletion событие вместо initialize (спасибо J_A_X!), проблема полностью исчезает. То, что, кажется, происходило, было именно этим событием.Полный обработчик событий (onComplete в стеке trace) использовал глобальный объект SP. Что-то в компиляции release (vs debug) должно было повлиять на время запуска инициализации переменной SP. Перемещение обработчика позже в onCompletion событие решило все проблемы.

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


обновление 2:

applicationComplete кажется, даже лучше, чем creationComplete поставить код инициализации приложения. См.эта запись в блоге для некоторого объяснения, и видео (около 4:25) евангелистом Adobe Tech для примера простой инициализации данных «запуск приложения».

9 ответов


Stack underflow в основном означает, что компилятор испортился.

можно использовать SWFWire Инспектор чтобы посмотреть байт-код обработчика событий, если вы хотите точно знать, как он испортился. Вы также можете использовать Отладчик SWFWire чтобы увидеть, какие методы были вызваны, но в этом случае, вы уже знали, где это происходило.

Если вы опубликуете сломанный swf, я могу дать вам больше информации.


Я избавился от этой ошибки, добавив аргумент компилятора:
— omit-trace-операторы=false


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

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

в моем случае, это был оператор трассировки как первая строка блока catch:

catch (e:TypeError) {
    trace(e.getStackTrace()); //This line is the problem
    throw new Error("Unexpected type encountered");
}

Я нашел кого-то еще с этим вопросом здесь.


этот код также приводит к стеку underflow только в режиме выпуска (флаг-debug=false):

true && trace('123');

mxlmc flex sdk версии 4.5.0.20967, flashplayer версии 10.3.181.14 (linux).

проверьте код на наличие подобных выражений.


этот код вызвал у меня проблемы, когда я скомпилировал кандидата на выпуск из flash builder 4.5

public function set configVO( value:PopupConfigVO ):void
        {trace("CHANGING")

разрешено путем вставки пространства между трассировкой и фигурной скобкой

public function set configVO( value:PopupConfigVO ):void
        { trace("CHANGING")

надеюсь, что это помогает.


для людей, ищущих ту же проблему, я только что получил это, вызванное оператором трассировки в случае «по умолчанию» оператора switch. Прокомментировал трассировку, stack underflow разрешен.


интересные… Я получал эту ошибку с SWF, который я вытащил из интернета, графическую демонстрацию на основе Away3D. В то время я запускал это на VM Tamarin, а не фактическое время выполнения Flash/AIR, поэтому мог придерживаться точки останова в строке «verifyFailed(kStackUnderflowError)» и видеть, что происходит.

флаг-Dverbose также помог найти виновника:

typecheck MethodInfo-1480()
  outer-scope = [global]
                       [Object~ Object] {} ()
  0:pop
VERIFY FAILED: Error #1024: Stack underflow occurred.

и глядя на ABC с помощью SWFInvestigator, я нашел это:

var function(Object):void   /* disp_id=0 method_id=1480 nameIndex = 0 */
{
   // local_count=2 max_scope=0 max_stack=0 code_len=2
   // method position=52968 code position=155063
   0      pop               
   1      returnvoid        
}

таким образом, существует очевидная проблема, когда «трассировка» была удалена, но компилятор поместил туда «pop»: я бы не подумал, что это необходимо, поскольку вызов трассировки предположительно должен был быть сделан через «callpropvoid»?

вполне почему это не терпит неудачу на AIR / Flash, я не знаю..

в любом случае: похоже на проблему компилятора ASC i.e возможно, один из компиляторов ActionScript3 имел ошибку с этим-следовательно, обходные пути, которые были до сих пор говорилось.


У меня была точно такая же проблема, но в моем случае причиной проблемы была инструкция trace в месте, где компилятор не ожидал, что он ее найдет, сразу после объявления пакета в начале класса:

package utils 
{

trace ("trace something here");

и именно поэтому компиляция в режиме отладки удалила проблему.


это довольно просто, и это не имеет ничего общего с пробелами до или после скобок, команд трассировки или что-то еще: это просто 1 действительно простая вещь:

НЕ ЦИКЛ ПУСТОЙ!

значение, при разработке, мы все / / иногда комментируем некоторые строки, и когда это приводит к

 for (...) { 
             // skip for now
         }

компилятор получает :

      for(...){}

и что мои хорошие друзья, это то, что компилятору не нравится!

Итак, никаких пустых петель и ты снова в пути…

счастливой охоты,
П.


Перевод публикуется с сокращениями, автор оригинальной статьи Megan Kaczanowski.

C, C++ и Objective-C являются ключевыми языками, имеющими уязвимости переполнения буфера, поскольку они работают с памятью более непосредственно чем многие интерпретируемые языки.

Даже если код написан на
«безопасном» языке (например, на Python), если используются любые
написанные на C, C++ или Objective C библиотеки, он все равно может быть уязвим для
переполнения буфера.

Выделение памяти

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

  • Объявление переменной в стеке: int numberPoints = 10.
  • Объявление переменной в куче: int* ptr = malloc (10 * sizeof(int)).

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

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

Поскольку переполнение
стека является наиболее часто используемым типом переполнения буфера, кратко
рассмотрим, как именно они работают.

Переполнение стека

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

Схема стека:

❓ Что такое переполнение буфера и как с ним бороться

Что такое stackframe?

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

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

  • Stack Pointer: указывает на топ стека вызовов процесса (или на последний помещенный в стек элемент).
  • Instruction Pointer: указывает на адрес следующей инструкции процессора, которая будет выполнена.
  • Base Pointer (BP): (также известный как указатель кадра) указывает на основание текущего кадра стека. Он остается постоянным до тех пор, пока программа выполняет текущий стекфрейм (хотя указатель стека может измениться).

Для примера рассмотрим
следующий код:

        int main() {
    int j = firstFunction(5);
    return 0;
}
    
int firstFunction(int z) {
    int x = 1 + z;
    return x;
}
    

Стек вызовов будет
выглядеть следующим образом, сразу после вызова firstFunction и выполнения
оператора int x = 1+z:

❓ Что такое переполнение буфера и как с ним бороться

Здесь main вызывает
firstFunction (которая в данный момент выполняется), поэтому она находится в
верхней части стека вызовов. Возвращаемый адрес – это адрес в памяти,
относящийся к функции, которая его вызвала (он удерживается указателем
инструкции при создании стекфрейма). Локальные переменные, которые все еще
находятся в области видимости, также находятся в стеке вызовов. Когда они
выполняются и выходят за пределы области действия, они удаляются из верха
стека.

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

Пример уязвимости переполнения
буфера:

        int main() {
    bufferOverflow();
 }
 
 bufferOverflow() {
    char textLine[10];
    printf("Enter your line of text: ");
    gets(textLine);
    printf("You entered: ", textLine);
    return 0;
 }
    

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

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

Почему происходит переполнение буфера?

Причина, по которой переполнение буфера стало такой серьезной проблемой, заключается в отсутствии проверки границ во многих функции управления памятью в C и C++. Хотя этот процесс сейчас довольно хорошо известен, он также очень часто эксплуатируется (например, зловред WannaCry использовал переполнение буфера).

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

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

Как уменьшить влияние переполнения
буфера:

  • Используйте интерпретируемый язык, который не подвержен этим проблемам.
  • Избегайте использования функций, которые не выполняют проверку буфера (например, в C вместо функции gets() используйте функцию fgets()).
  • Применяйте компиляторы, которые помогают определить небезопасные функции или найти ошибки.
  • Используйте canaries, которые могут помочь предотвратить переполнение буфера. Они вставляются перед обратным адресом в стеке и проверяются перед обращением к нему. Если программа обнаружит изменение значения canary, она прервет процесс, не позволив злоумышленнику пробиться. Значение canary является либо случайным (поэтому злоумышленнику очень трудно его угадать), либо строкой, которую по техническим причинам невозможно перезаписать.
  • Переставляйте локальные переменных таким образом, чтобы скалярные (отдельные объекты данных фиксированного размера) были выше переменных массива, содержащих несколько значений. Это означает, что если переменные массива переполняются, они не будут влиять на скалярные переменные. Этот метод в сочетании с canary-значениями очень помогает.
  • Сделайте стек неисполняемым, установив бит NX (No-eXecute), чтобы злоумышленник не вставлял шелл-код непосредственно в стек и не выполнял его там. Это неидеальное решение, так как даже неисполняемые стеки могут стать жертвами атак переполнения буфера, вроде return-to-libc. Эта атака происходит, когда обратный адрес стекового фрейма заменяется адресом библиотеки, уже находящейся в адресном пространстве процесса. К тому же не все процессоры позволяют установить бит NX.
  • ASLR (рандомизация расположения адресного пространства) может служить общей защитой, а также специфической защитой от атак return-to-libc. Это означает, что всякий раз, когда файл библиотеки или другая функция вызывается запущенным процессом, ее адрес сдвигается на случайное число. Это делает практически невозможным связать фиксированный адрес памяти процесса с функциями, из чего следует, что злоумышленнику может быть трудно узнать, откуда вызывать определенные функции. ASLR включен по умолчанию во многих версиях Linux, OS X и Android.

Такая уязвимость возникает, когда две части программы по-разному обрабатывают один и
тот же блок памяти. Например, если вы выделите массив размером X, но заполните
его массивом размером x < X, а затем попытаетесь извлечь все X байтов, скорее
всего вы получите «грязные» данные для X – x байтов.

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

Заключение

Рассмотренная уязвимость
является очень серьезной угрозой стабильной работе любого продукта.
Необходимо приложить все усилия и проверить ваши проекты на ее наличие, т. к. последствия могут быть весьма плачевными (уже упоминался
Ransome) и болезненными. Используйте советы из статьи и вы уменьшите вероятность успешного проникновения
злоумышленников в ваш код. Удачи в обучении!

Дополнительные материалы:

  • Алгоритмы в C++: запросы к статическим массивам
  • ТОП-10 трюков на C++, которые облегчат вам жизнь
  • Сайт на C++ своими руками с помощью библиотеки cgicc
  • 5 шагов для создания простой формы входа на C#
  • 10 самых популярных алгоритмов сортировки на C#

Я действительно изо всех сил пытаюсь решить стек underflow, который я получаю. Трассировка, которую я получаю во время выполнения:

VerifyError: Error #1024: Stack underflow occurred.

at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()

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

есть ли у кого-нибудь советы по отладке стека Underflow? Есть ли четкое объяснение того, что это означает для Flash?

в случае, если это помогает, эта ошибка происходит, когда я нажимаю кнопку, обработчик которой делает вызов RPC, который использует URLLoader, AsyncToken, а затем вызывает набор экземпляров AsyncResponder, связанных с AsyncToken. С некоторыми серверными журналами, а также некоторыми журналами, взломанными в swf, я знаю, что UrlLoader успешно выполняет и получает crossdomain.xml-файл, правильно его обрабатывает (т. е.: если я его разрушу, я получу ошибку безопасности), а также успешно завершает запрос «load» (сервер отправляет данные.) Кажется, что в этом случае происходит утечка.Полный процесс прослушивания/обработки (как, конечно, подразумевается и обратной трассировкой).

mxmlc используется = из flex_sdk_4.5.0.20967

пример игрока (я пробовал несколько) = 10.2.153.1


обновление: моя конкретная проблема решается… но я оставляю вопрос как есть, так как я хотел бы знать, как обычно отлаживать такую проблему, а не просто получать мои конкретные решение.

в моем коде у меня было следующее определение приложения:

<s:Application height="100%" width="100%"
                              xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               initialize="InitData();">

обратите внимание, что код / был прикреплен к initialize событие.

InitData () и соответствующие определения:

import classes.RpcServerProxy;
public var SP:RpcServerProxy;

public function InitData():void {
    SP = new RpcServerProxy("http://192.168.1.102:1234");
}

когда я переключил вызов InitData (), чтобы быть на onCompletion событие вместо initialize (спасибо J_A_X!), проблема полностью исчезает. То, что, кажется, происходило, было именно этим событием.Полный обработчик событий (onComplete в стеке trace) использовал глобальный объект SP. Что-то в компиляции release (vs debug) должно было повлиять на время запуска инициализации переменной SP. Перемещение обработчика позже в onCompletion событие решило все проблемы.

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


обновление 2:

applicationComplete кажется, даже лучше, чем creationComplete поставить код инициализации приложения. См.эта запись в блоге для некоторого объяснения, и видео (около 4:25) евангелистом Adobe Tech для примера простой инициализации данных «запуск приложения».

9 ответов


Stack underflow в основном означает, что компилятор испортился.

можно использовать SWFWire Инспектор чтобы посмотреть байт-код обработчика событий, если вы хотите точно знать, как он испортился. Вы также можете использовать Отладчик SWFWire чтобы увидеть, какие методы были вызваны, но в этом случае, вы уже знали, где это происходило.

Если вы опубликуете сломанный swf, я могу дать вам больше информации.


Я избавился от этой ошибки, добавив аргумент компилятора:
— omit-trace-операторы=false


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

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

в моем случае, это был оператор трассировки как первая строка блока catch:

catch (e:TypeError) {
    trace(e.getStackTrace()); //This line is the problem
    throw new Error("Unexpected type encountered");
}

Я нашел кого-то еще с этим вопросом здесь.


этот код также приводит к стеку underflow только в режиме выпуска (флаг-debug=false):

true && trace('123');

mxlmc flex sdk версии 4.5.0.20967, flashplayer версии 10.3.181.14 (linux).

проверьте код на наличие подобных выражений.


этот код вызвал у меня проблемы, когда я скомпилировал кандидата на выпуск из flash builder 4.5

public function set configVO( value:PopupConfigVO ):void
        {trace("CHANGING")

разрешено путем вставки пространства между трассировкой и фигурной скобкой

public function set configVO( value:PopupConfigVO ):void
        { trace("CHANGING")

надеюсь, что это помогает.


для людей, ищущих ту же проблему, я только что получил это, вызванное оператором трассировки в случае «по умолчанию» оператора switch. Прокомментировал трассировку, stack underflow разрешен.


интересные… Я получал эту ошибку с SWF, который я вытащил из интернета, графическую демонстрацию на основе Away3D. В то время я запускал это на VM Tamarin, а не фактическое время выполнения Flash/AIR, поэтому мог придерживаться точки останова в строке «verifyFailed(kStackUnderflowError)» и видеть, что происходит.

флаг-Dverbose также помог найти виновника:

typecheck MethodInfo-1480()
  outer-scope = [global]
                       [Object~ Object] {} ()
  0:pop
VERIFY FAILED: Error #1024: Stack underflow occurred.

и глядя на ABC с помощью SWFInvestigator, я нашел это:

var function(Object):void   /* disp_id=0 method_id=1480 nameIndex = 0 */
{
   // local_count=2 max_scope=0 max_stack=0 code_len=2
   // method position=52968 code position=155063
   0      pop               
   1      returnvoid        
}

таким образом, существует очевидная проблема, когда «трассировка» была удалена, но компилятор поместил туда «pop»: я бы не подумал, что это необходимо, поскольку вызов трассировки предположительно должен был быть сделан через «callpropvoid»?

вполне почему это не терпит неудачу на AIR / Flash, я не знаю..

в любом случае: похоже на проблему компилятора ASC i.e возможно, один из компиляторов ActionScript3 имел ошибку с этим-следовательно, обходные пути, которые были до сих пор говорилось.


У меня была точно такая же проблема, но в моем случае причиной проблемы была инструкция trace в месте, где компилятор не ожидал, что он ее найдет, сразу после объявления пакета в начале класса:

package utils 
{

trace ("trace something here");

и именно поэтому компиляция в режиме отладки удалила проблему.


это довольно просто, и это не имеет ничего общего с пробелами до или после скобок, команд трассировки или что-то еще: это просто 1 действительно простая вещь:

НЕ ЦИКЛ ПУСТОЙ!

значение, при разработке, мы все / / иногда комментируем некоторые строки, и когда это приводит к

 for (...) { 
             // skip for now
         }

компилятор получает :

      for(...){}

и что мои хорошие друзья, это то, что компилятору не нравится!

Итак, никаких пустых петель и ты снова в пути…

счастливой охоты,
П.


Японский производитель оргтехники Kyocera выпускает одни из самых качественных печатающих устройств на рынке, которые, в первую очередь, пользуются высоким спросом у бизнеса. А это уже говорит о многом!

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

Тем не менее, даже самая качественная оргтехника может давать сбои. Особенно, если за ней не следить!

Поэтому сегодня мы рассмотрим наиболее распространенные коды ошибок у популярных принтеров Kyocera FS-1020MFP, FS-1025MFP, FS-1030MFP, FS-1120MFP, FS-1125MFP, FS-1220MFP и прочих моделей, чтобы разобраться, какие неполадки можно устранить своими руками, а в каких случаях необходимо воспользоваться помощью специалистов.

  • Сброс ошибок у принтеров Kyocera своими руками
  • Устранение ошибок у принтеров Kyocera в сервисном центре

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

Ошибка №

Причина

Решение проблемы

E-0001

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

1. установка оригинального картриджа;

2. замена поврежденного чипа;

3. прошивка принтера – затем в печатающее устройство можно будет установить любой картридж неограниченное количество раз;

4. сброс ошибки – зажмите на несколько секунд кнопки «Режим» и «Сброс».

E-0002

Регион используемого картриджа не соответствует характеристикам принтера. Проблема решается несколькими способами:

1. установка соответствующего региону принтера картриджа;

2. замена чипа;

3. прошивка принтера.

E-0003

Память печатающего устройства заполнена. Распечатайте уже отсканированные документы или сбросьте операцию соответствующей кнопкой.

E-0007

В картридже закончился тонер. Замените картридж на новый оригинальный, совместимый или заправьте расходник.

E-0008

Одна из крышек принтера не закрыта. Захлопните заднюю и переднюю крышки принтера, ощутив характерный щелчок.

E-0009

Лоток с отпечатками переполнен. Извлеките распечатанные листы с бумагой, а затем возобновите печать кнопкой «Старт».

E-0012

Память принтера заполнена. Измените разрешение печати в меньшую сторону – до 600 dpi.

E-0014

Установлена бумага такого формата, который принтер не поддерживает. Замените бумагу листами совместимого формата.

Иногда функционал принтера может быть ограничен на софтверном уровне.

Чтобы расширить диапазон форматов, мы рекомендуем обновить ПО печатающего устройства.

E-0015

1. У принтера отсутствует питание.

2. Сетевой кабель не подключен.

3. На персональном компьютере отсутствует драйвер.

Проверьте целостность сетевого кабеля.

Включите принтер.

При необходимости установите драйвер.

E-0018

Выбранный файл отсутствует в очереди на печать. Сбросьте операцию, нажав на кнопку «Сброс». Затем выберите новый файл и продолжите печать.

E-0019

Формат печати не поддерживается принтером. Сбросьте операцию, нажав на кнопку «Сброс».

J-0511

Бумагу зажевало. Аккуратно извлеките остатки бумаги из корпуса принтера.

PF

Отсутствует бумага во входном лотке. Установите бумагу во входной лоток и возобновите печать, нажав на кнопку «Старт».
Ошибка №

Возможная причина

0030

Неисправна PWB-плата.

0100

Неисправна Flash-память или плата PWB.

0120

Неисправна Flash-память.

0190

Неисправна Flash-память или плата PWB.

0630

Неисправна PWB-плата.

2000

1. Неисправна PWB-плата;

2. неисправен соединительный кабель или нарушена целостность соединения контактов;

3. неисправен привод или его отдельные узлы.

3100

1. Неисправен соединительный кабель или нарушена целостность соединения контактов;

2. неисправен датчик положения;

3. неисправен привод сканера;

4. неисправна PWB-плата.

3300

1. Неисправен соединительный кабель или нарушена целостность соединения контактов;

2. неисправен датчик CIS;

3. неисправна PWB-плата.

3500

Неисправна PWB-плата.

4000

1. Неисправен соединительный кабель или нарушена целостность соединения контактов;

2. неисправен привод;

3. неисправна PWB-плата.

4200

1. Неисправен соединительный кабель или нарушена целостность соединения контактов;

2. неисправна PWB-плата и отдельные компоненты.

6000

1. Неисправен соединительный кабель или нарушена целостность соединения контактов;

2. неисправен термостат;

3. неисправен нагреватель фьюзера;

4. неисправна PWB-плата и отдельные компоненты.

6020

1. Неисправна PWB-плата и отдельные компоненты;

2. выявлен дефект у термистора.

6030

1. Неисправен соединительный кабель или нарушена целостность соединения контактов;

2. выявлен дефект у термистора;

3. неисправен термостат;

4. неисправна PWB-плата и отдельные компоненты.

6400

1. Неисправен соединительный кабель или нарушена целостность соединения контактов;

2. неисправна PWB-плата и отдельные компоненты.

F000

Неисправна PWB-плата и отдельные компоненты.

F020

Неисправна PWB-плата.

F040

Неисправна PWB-плата.

F05D

1. Неисправно программное обеспечение привода;

2. неисправна PWB-плата и отдельные компоненты.

Попытались самостоятельно устранить ошибку на принтере Kyocera, но проблемы с печатью остались нерешенными? Сервисный центр МосТонер – круглосуточный бесплатный выезд мастера в пределах МКАД. Вы платите только за результат!

Как отладить ошибку переполнения стека во время выполнения?

Я действительно изо всех сил пытаюсь решить возникающее у меня переполнение стека. Во время выполнения я получаю следующую трассировку:

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

Есть ли у кого-нибудь советы по отладке Stack Underflow? Есть ли четкое объяснение того, что это значит для Flash?

В случае, если это помогает, эта ошибка возникает, когда я нажимаю кнопку, обработчик которой выполняет вызов RPC, который использует URLLoader, AsyncToken, а затем вызывает набор экземпляров AsyncResponder, связанных с AsyncToken. С некоторым журналированием на стороне сервера, а также с некоторыми журналами, взломанными в swf, я знаю, что UrlLoader успешно выполняет и GET’ing файл crossdomain.xml, правильно его обрабатывает (то есть: если я его разрушу, я получаю безопасность error), а также успешно выполняет запрос «загрузки» (сервер отправляет данные). Похоже, что недостаточное заполнение происходит в процессе прослушивания / обработки Event.COMPLETE (что, конечно, также подразумевается трассировкой).

mxmlc used = from flex_sdk_4.5.0.20967

Пример плеера (несколько пробовал) = 10.2.153.1

ОБНОВЛЕНИЕ : моя конкретная проблема решена . но я оставляю вопрос как есть, поскольку я хотел бы знать, как в целом отлаживать такую ​​проблему, а не просто получать свое конкретное решение.

В моем коде у меня было следующее определение приложения:

Обратите внимание, что код прикреплен к initialize событию.

InitData () и соответствующие определения:

Когда я переключил вызов InitData () на onCompletion событие вместо initialize (спасибо J_A_X!), Проблема полностью исчезла. Похоже, что произошло то, что обработчик событий Event.COMPLETE (onComplete в трассировке стека) использовал глобальный объект SP. Что-то в компиляции выпуска (по сравнению с отладкой) должно было влиять на время запуска инициализации переменной SP. Перенос обработчика позже к onCompletion событию решил все проблемы.

Как было сказано выше, я все же хотел бы знать, какие уловки / инструменты доступны для отладки подобных проблем инициализации.

ОБНОВЛЕНИЕ 2:

applicationComplete кажется даже лучшим мероприятием, чем creationComplete ставить код инициализации приложения. См. Некоторые пояснения в этой записи в блоге и в этом видео (около 4:25) от Adobe Tech Evangelist для примера простой инициализации данных «запуск приложения».

Источник

Как отладить ошибку underflow стека времени выполнения?

Я действительно изо всех сил пытаюсь решить стек underflow, который я получаю. Трассировка, которую я получаю во время выполнения:

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

есть ли у кого-нибудь советы по отладке стека Underflow? Есть ли четкое объяснение того, что это означает для Flash?

в случае, если это помогает, эта ошибка происходит, когда я нажимаю кнопку, обработчик которой делает вызов RPC, который использует URLLoader, AsyncToken, а затем вызывает набор экземпляров AsyncResponder, связанных с AsyncToken. С некоторыми серверными журналами, а также некоторыми журналами, взломанными в swf, я знаю, что UrlLoader успешно выполняет и получает crossdomain.xml-файл, правильно его обрабатывает (т. е.: если я его разрушу, я получу ошибку безопасности), а также успешно завершает запрос «load» (сервер отправляет данные.) Кажется, что в этом случае происходит утечка.Полный процесс прослушивания/обработки (как, конечно, подразумевается и обратной трассировкой).

mxmlc используется = из flex_sdk_4.5.0.20967

пример игрока (я пробовал несколько) = 10.2.153.1

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

в моем коде у меня было следующее определение приложения:

обратите внимание, что код / был прикреплен к initialize событие.

InitData () и соответствующие определения:

когда я переключил вызов InitData (), чтобы быть на onCompletion событие вместо initialize (спасибо J_A_X!), проблема полностью исчезает. То, что, кажется, происходило, было именно этим событием.Полный обработчик событий (onComplete в стеке trace) использовал глобальный объект SP. Что-то в компиляции release (vs debug) должно было повлиять на время запуска инициализации переменной SP. Перемещение обработчика позже в onCompletion событие решило все проблемы.

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

обновление 2:

applicationComplete кажется, даже лучше, чем creationComplete поставить код инициализации приложения. См.эта запись в блоге для некоторого объяснения, и видео (около 4:25) евангелистом Adobe Tech для примера простой инициализации данных «запуск приложения».

9 ответов

Stack underflow в основном означает, что компилятор испортился.

можно использовать SWFWire Инспектор чтобы посмотреть байт-код обработчика событий, если вы хотите точно знать, как он испортился. Вы также можете использовать Отладчик SWFWire чтобы увидеть, какие методы были вызваны, но в этом случае, вы уже знали, где это происходило.

Если вы опубликуете сломанный swf, я могу дать вам больше информации.

Я избавился от этой ошибки, добавив аргумент компилятора:
— omit-trace-операторы=false

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

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

в моем случае, это был оператор трассировки как первая строка блока catch:

Я нашел кого-то еще с этим вопросом здесь.

этот код также приводит к стеку underflow только в режиме выпуска (флаг-debug=false):

mxlmc flex sdk версии 4.5.0.20967, flashplayer версии 10.3.181.14 (linux).

проверьте код на наличие подобных выражений.

этот код вызвал у меня проблемы, когда я скомпилировал кандидата на выпуск из flash builder 4.5

разрешено путем вставки пространства между трассировкой и фигурной скобкой

надеюсь, что это помогает.

для людей, ищущих ту же проблему, я только что получил это, вызванное оператором трассировки в случае «по умолчанию» оператора switch. Прокомментировал трассировку, stack underflow разрешен.

интересные. Я получал эту ошибку с SWF, который я вытащил из интернета, графическую демонстрацию на основе Away3D. В то время я запускал это на VM Tamarin, а не фактическое время выполнения Flash/AIR, поэтому мог придерживаться точки останова в строке «verifyFailed(kStackUnderflowError)» и видеть, что происходит.

флаг-Dverbose также помог найти виновника:

и глядя на ABC с помощью SWFInvestigator, я нашел это:

таким образом, существует очевидная проблема, когда «трассировка» была удалена, но компилятор поместил туда «pop»: я бы не подумал, что это необходимо, поскольку вызов трассировки предположительно должен был быть сделан через «callpropvoid»?

вполне почему это не терпит неудачу на AIR / Flash, я не знаю..

в любом случае: похоже на проблему компилятора ASC i.e возможно, один из компиляторов ActionScript3 имел ошибку с этим-следовательно, обходные пути, которые были до сих пор говорилось.

У меня была точно такая же проблема, но в моем случае причиной проблемы была инструкция trace в месте, где компилятор не ожидал, что он ее найдет, сразу после объявления пакета в начале класса:

и именно поэтому компиляция в режиме отладки удалила проблему.

это довольно просто, и это не имеет ничего общего с пробелами до или после скобок, команд трассировки или что-то еще: это просто 1 действительно простая вещь:

значение, при разработке, мы все / / иногда комментируем некоторые строки, и когда это приводит к

и что мои хорошие друзья, это то, что компилятору не нравится!

Итак, никаких пустых петель и ты снова в пути.

Источник

ERROR NAME; stackunderflow COMMAND; pop OPERAND STACK;

I get the message ERROR NAME; stackunderflow COMMAND; pop OPERAND STACK; when I try to print from Firefox or anything that has a picture as part of the file. I am running saucy on an AMD64 system. so far I have tried deleting the printer and setting it up again. No change

Question information

Related bugs

Related FAQ:

What is the output of:

lsb_release -a; uname -a; apt-cache policy firefox

$ lsb_release -a; uname -a; apt-cache policy firefox
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 13.10
Release: 13.10
Codename: saucy
Linux Mike 3.11.0-18-generic #32-Ubuntu SMP Tue Feb 18 21:11:14 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
firefox:
Installed: 27.0.1+ build1- 0ubuntu0. 13.10.1
Candidate: 27.0.1+ build1- 0ubuntu0. 13.10.1
Version table:
*** 27.0.1+ build1- 0ubuntu0. 13.10.1 0
500 http:// us.archive. ubuntu. com/ubuntu/ saucy-updates/main amd64 Packages
500 http:// security. ubuntu. com/ubuntu/ saucy-security/main amd64 Packages
100 /var/lib/ dpkg/status
24. 0+build1- 0ubuntu1 0
500 http:// us.archive. ubuntu. com/ubuntu/ saucy/main amd64 Packages
mike@Mike:

BTW the printer is a Brother MFC-7840W . I borrowed an HP 8100 and used the HP driver. It did not have the same problem printing.

Did you install the Brother printer drivers from the Brother site. They make debs for their products.

Источник

ERROR NAME; stackunderflow COMMAND; pop OPERAND STACK;

I get the message ERROR NAME; stackunderflow COMMAND; pop OPERAND STACK; when I try to print from Firefox or anything that has a picture as part of the file. I am running saucy on an AMD64 system. so far I have tried deleting the printer and setting it up again. No change

Question information

Related bugs

Related FAQ:

What is the output of:

lsb_release -a; uname -a; apt-cache policy firefox

$ lsb_release -a; uname -a; apt-cache policy firefox
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 13.10
Release: 13.10
Codename: saucy
Linux Mike 3.11.0-18-generic #32-Ubuntu SMP Tue Feb 18 21:11:14 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
firefox:
Installed: 27.0.1+ build1- 0ubuntu0. 13.10.1
Candidate: 27.0.1+ build1- 0ubuntu0. 13.10.1
Version table:
*** 27.0.1+ build1- 0ubuntu0. 13.10.1 0
500 http:// us.archive. ubuntu. com/ubuntu/ saucy-updates/main amd64 Packages
500 http:// security. ubuntu. com/ubuntu/ saucy-security/main amd64 Packages
100 /var/lib/ dpkg/status
24. 0+build1- 0ubuntu1 0
500 http:// us.archive. ubuntu. com/ubuntu/ saucy/main amd64 Packages
mike@Mike:

BTW the printer is a Brother MFC-7840W . I borrowed an HP 8100 and used the HP driver. It did not have the same problem printing.

Did you install the Brother printer drivers from the Brother site. They make debs for their products.

Источник

Проблемы с печатью больших файлов

Все новые темы

Автор
DeniTornado
Старожил форума

Зарегистрирован: 22.10.2007
Пользователь #: 62,692
Сообщения: 2473


Голоса: 2

Добавлено: Ср 13 Апр, 2016 15:40 Заголовок сообщения:
Вернуться к началу

Зарегистрируйтесь и реклама исчезнет!

DeniTornado
Старожил форума

Зарегистрирован: 22.10.2007
Пользователь #: 62,692
Сообщения: 2473


Голоса: 2

Добавлено: Пт 20 Май, 2016 13:02 Заголовок сообщения:
Вернуться к началу

Paranoya
Почетный житель

Зарегистрирован: 14.12.2006
Пользователь #: 48,281
Сообщения: 5249


Голоса: 45

Добавлено: Пт 20 Май, 2016 13:55 Заголовок сообщения:
_________________
Он был расстроенным трупом и потратил две минуты впустую
Вернуться к началу

DeniTornado
Старожил форума

Зарегистрирован: 22.10.2007
Пользователь #: 62,692
Сообщения: 2473


Голоса: 2

Добавлено: Пт 20 Май, 2016 14:05 Заголовок сообщения:
Вернуться к началу

Paranoya
Почетный житель

Зарегистрирован: 14.12.2006
Пользователь #: 48,281
Сообщения: 5249


Голоса: 45

Добавлено: Пт 20 Май, 2016 15:43 Заголовок сообщения:
_________________
Он был расстроенным трупом и потратил две минуты впустую
Вернуться к началу

mrhron
Участник форума

Зарегистрирован: 09.11.2010
Пользователь #: 92,299
Сообщения: 391


Голоса: 8

Добавлено: Пт 20 Май, 2016 15:49 Заголовок сообщения:
Вернуться к началу

DeniTornado
Старожил форума

Зарегистрирован: 22.10.2007
Пользователь #: 62,692
Сообщения: 2473


Голоса: 2

Добавлено: Пн 23 Май, 2016 11:57 Заголовок сообщения:
Вернуться к началу

sergeykp
Участник форума

Зарегистрирован: 13.03.2006
Пользователь #: 33,871
Сообщения: 480
Откуда: Томск

Голоса: 4

Добавлено: Чт 09 Июн, 2016 11:41 Заголовок сообщения:
Вернуться к началу

DeniTornado
Старожил форума

Зарегистрирован: 22.10.2007
Пользователь #: 62,692
Сообщения: 2473


Голоса: 2

Добавлено: Пн 27 Июн, 2016 16:26 Заголовок сообщения:
Вернуться к началу

Paranoya
Почетный житель

Зарегистрирован: 14.12.2006
Пользователь #: 48,281
Сообщения: 5249

Источник

Adblock
detector

Для решения различных проблем с ПК мы рекомендуем DriverFix:
Это программное обеспечение будет поддерживать ваши драйверы в рабочем состоянии, тем самым защищая вас от распространенных компьютерных ошибок и сбоев оборудования. Проверьте все свои драйверы сейчас за 3 простых шага:

  1. Скачать DriverFix (проверенный файл загрузки).
  2. Нажмите Начать сканирование найти все проблемные драйверы.
  3. Нажмите Обновите драйверы чтобы получить новые версии и избежать сбоев в работе системы.
  • DriverFix был загружен 0 читатели в этом месяце.

Если вы используете Postscript принтер, при печати документов вы можете столкнуться с синтаксической ошибкой принтера, вызывающей ошибку команды. Полная ошибка гласит: ERROR: syntaxerror OFFENDING COMMAND: –nostringval– STACK: mark

Эта ошибка может возникать при печати из программы просмотра фотографий или редактирования, а также текстовых редакторов, таких как Microsoft Wordpad.

Если вас также беспокоит эта ошибка, вот несколько советов по устранению неполадок, которые помогут вам разрешить команду, нарушающую синтаксическую ошибку принтера в Windows 10.


Как исправить синтаксическую ошибку вызывающей команду на принтерах

1. Конвертируйте файл в PDF

Ошибка синтаксиса принтера, вызывающая ошибку

  1. Откройте документ в MS Word.
  2. Нажмите на Файл и выберите Сохранить как.
  3. Щелкните раскрывающееся меню для Сохранитьв виде и выберите PDF из вариантов.
  4. Введите имя и сохраните файл.
  5. Откройте PDF-файл в программе просмотра PDF-файлов и попробуйте распечатать файл. Принтер должен успешно распечатать файл.

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


Ищете хороший принтер как для дома, так и для офиса? Ознакомьтесь с этим руководством, чтобы найти лучшие из доступных.


2. Удалите и повторно добавьте принтер

Ошибка синтаксиса принтера, вызывающая ошибку

  1. Нажмите на Начинать и выберите Настройки.
  2. Перейти к Устройств.
  3. Выбирать Принтерыи сканеры.
  4. Прокрутите вниз до списка установленных принтеров.
  5. Выберите свой принтер и нажмите Удалить устройство.
  6. Нажмите да для подтверждения действия.

2.1 Удаление программного обеспечения

Драйвер печати PSL6

  1. Нажмите Клавиша Windows + R, чтобы открыть Run.
  2. Тип контроль и нажмите ОК.
  3. в Панель управления окно, перейдите в Программы> Программы и компоненты.
  4. Выберите приложение для принтера из списка приложений-установщиков.
  5. Нажмите на Удалить. Нажмите да если будет предложено ОАК.
  6. Следуйте инструкциям на экране, чтобы удалить программное обеспечение.

2.2. Добавить принтер

Ошибка синтаксиса принтера, вызывающая ошибку

  1. Загрузите последнюю версию программного обеспечения вашего принтера. Вы можете скачать его с сайта производителя.
  2. Установите программное обеспечение принтера.
  3. Далее нажмите на Пуск> Настройки и выберите Устройство.
  4. Нажмите на Принтеры и сканеры.
  5. Нажмите на Добавлятьапринтер или сканер.
  6. Следуйте инструкциям на экране, чтобы установить принтер.
  7. Теперь попробуйте распечатать, используя только что добавленный принтер, и проверьте, нет ли улучшений.

3. Используйте универсальные драйверы печати HP

Драйвер печати PSL6

  1. нажмите Окна ключ и поиск управления.
  2. Нажмите и откройте Панель управления.
  3. Перейти к Оборудование и звук> Устройства и принтеры.
    Драйвер печати PSL6
  4. Выберите свой принтер из списка и нажмите Свойства сервера печати.
  5. В окне «Свойства сервера печати» выберите драйвер принтера.
  6. Щелкните значок Удалять кнопка. Нажмите да для подтверждения действия.
  7. Закройте окно «Свойства» и панель управления.

3.1 Загрузить универсальные драйверы печати HP

Драйвер печати PSL6

  1. Перейдите на страницу загрузки программного обеспечения и драйверов HP.
  2. Загрузите и установите последнюю версию Универсальный драйвер печати HP.
  3. Убедитесь, что вы повторно добавили принтер, и проверьте наличие улучшений.
    • Обратитесь к методу 2

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

Если вам известно о другом исправлении или обходном пути для этой ошибки принтера, сообщите нам об этом, оставив сообщение в разделе комментариев ниже.

Часто задаваемые вопросы

  • Что такое ошибка PostScript?

    Ошибки PostScript возникают, когда интерпретатор не может прочитать код PostScript или код PostScript превышает ограничения на языке описания страницы.

  • Что означает оскорбительная команда?

    Оскорбительная команда — это сообщение об ошибке, указывающее на команду, которая вызвала конкретную проблему. Вы можете использовать эту информацию, чтобы изучить первопричины проблемы при попытке ее устранения.

  • Как исправить ошибки PostScript?

    Вот как можно исправить ошибки PostScript при печати: попробуйте распечатать тот же документ еще раз, используйте другой компьютер, установите последние обновления драйвера принтера, запустите встроенное средство устранения неполадок принтера в Windows 10 и сбросьте принтер.

Я написал фрагмент кода Java для отправки сценариев postscript в формате PDF на сетевой принтер через Socket.

Файлы были напечатаны в идеальной форме, но каждое задание сопровождается одной или двумя дополнительными страницами с такими текстами, как ps: stack underflow или error undefined offending command.

Сначала я подумал, что с процессом PDF2PS что-то не так, поэтому попробовал 2 файла PS из этого Файлы PS. Но проблема все еще существует.

Я также проверил файлы ps с помощью GhostView. Теперь я думаю, что с кодом что-то не так. Код не вызывает исключений.

Принтер Toshiba e-studion 5005AC поддерживает PS3 и PCL6.

    File file = new File("/path/to/my.ps");

    Socket socket = null;
    DataOutputStream out = null;
    FileInputStream inputStream = null;
    try {
        socket = new Socket(printerIP, printerPort);
        out = new DataOutputStream(socket.getOutputStream());
        DataInputStream input = new DataInputStream(socket.getInputStream());
        inputStream = new FileInputStream(file);
        byte[] buffer = new byte[8000];

        while (inputStream.read(buffer) != -1) {
            out.write(buffer);

        }

        out.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }

1 ответ

Лучший ответ

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

Примере

Например представьте, что у вас есть следующий файл и вы используете буфер размером 10:

 1234567890ABCDEF

После первого вызова inputStream.read() он вернет 10, и в буфере у вас будет:

 1234567890

После второго вызова inputStream.read() он вернет 6, и в буфере у вас будет:

 ABCDEF7890

После третьего вызова inputStream.read() он вернет -1, и вы перестанете читать.

В конце концов, сокет принтера получит эти данные:

1234567890ABCDEF7890

Здесь последний 7890 — это дополнительный бит, который принтер не понимает, но он может успешно интерпретировать первый 1234567890ABCDEF.

Fix

Вы должны учитывать длину, возвращаемую inputStream.read():

        byte[] buffer = new byte[8000];
        for (int length; (length = inputStream.read(buffer)) != -1; ){
            out.write(buffer, 0, length);
        }

Также рассмотрите возможность использования try-with-resources, чтобы избежать проблем с незамкнутые потоки.


1

Devstr
13 Фев 2018 в 19:57

Понравилась статья? Поделить с друзьями:
  • Stack overflow это ошибка
  • Stack overflow ошибка делфи
  • Stack overflow delphi ошибка
  • Stable diffusion ошибка
  • Stability track опель астра ошибка