Ir para conteúdo
  • Cadastre-se

dev botao

Boleto_GerarRemessaStrem Segmentation fault no Node e Linux


Ver Solução Respondido por GEW Tecnologia,

Recommended Posts

  • Membros Pro
Postado

Estou com este problema ao gerar remessa:

PID 4557 received SIGSEGV for address: 0x0
/home/gew/projects/easy-invoice-v2/node_modules/segfault-handler/build/Release/segfault-handler.node(+0x3351)[0x7ff4716e7351]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x14420)[0x7ff490f8f420]
/home/gew/projects/easy-invoice-v2/src/config/acbrlib/config-files/libacbrboleto64.so(+0x2a44dc)[0x7ff471a414dc]
Segmentation fault

Eu consigo rodar as funções: Boleto_Inicializar, Boleto_LimparLista, Boleto_ConfigurarDados e Boleto_IncluirTitulos sem problemas, mas a Boleto_GerarRemessaStrem sempre retorna este Segmention Fault.

Esta é a função executada, chamo ela com: 'await gerarRemessaStreamBoleto(handle, 8192);'

export const gerarRemessaStreamBoleto = async (
  handle: any,
  tamanhoBuffer: number
): Promise<ResponseStatusModel> => {
  Logs.info('Boleto.Gerar_Remessa_Stream');
  return await new Promise((resolve, reject) => {
    let alocResposta = Buffer.alloc(tamanhoBuffer);
    let alocTamanho = ref.alloc('int', tamanhoBuffer);

    const response = AcbrBoleto.Boleto_GerarRemessaStream(handle, 1, alocResposta, alocTamanho);

    if (response === -1) {
      return reject({
        status: HttpStatus.BAD_GATEWAY,
        error: 'Falha ao inicializar a biblioteca',
      });
    }

    if (response === -10) {
      return reject({
        status: HttpStatus.BAD_GATEWAY,
        error: 'Falha na execução do método',
      });
    }

    resolve({
      status: HttpStatus.NO_CONTENT,
      data: '',
    });
  });
};

A 'AcbrBoleto.Boleto_GerarRemessaStream' é chamada do FFi

Segue o retorno do Log:

04/11/24 08:44:11:969 - TLibBoletoConfig.AplicarConfiguracoes: /home/gew/projects/easy-invoice-v2/src/config/acbrlib/config-files/ACBrLib.ini
04/11/24 08:44:11:969 - Travar
04/11/24 08:44:11:969 - TLibBoletoConfig.AplicarConfiguracoes - Feito
04/11/24 08:44:11:969 - Destravar
04/11/24 08:44:11:969 - TLibBoletoConfig.Ler - Feito
04/11/24 08:44:11:969 - Destravar
04/11/24 08:44:11:969 - LIB_Inicializar( /home/gew/projects/easy-invoice-v2/src/config/acbrlib/config-files/ACBrLib.ini,  )
04/11/24 08:44:11:969 -    ACBrLibBoleto - 1.2.1.317
04/11/24 08:44:11:989 - Boleto_LimparLista
04/11/24 08:44:11:990 - Travar
04/11/24 08:44:11:990 -    SetRetorno(0, )
04/11/24 08:44:11:990 - Destravar
04/11/24 08:44:11:990 - Boleto_ConfigurarDados([CR][LF][CR][LF][Cedente][CR][LF]Nome=SAO JOAO LTDA.[CR][LF]CNPJCPF=37636044000112[CR][LF]Logradouro=Rua Evaristo Mendes[CR][LF]Numero=200[CR][LF]Bairro=Centro[CR][LF]Cidade=Tatui[CR][LF]CEP=18.270-000[CR][LF]Complemento=Sala 10[CR][LF]UF=SP[CR][LF]RespEmis=0[CR][LF]TipoPessoa=1[CR][LF]CodigoCedente=123456[CR][LF]LayoutBol=3[CR][LF]CaracTitulo=0[CR][LF]TipoCarteira=0[CR][LF]TipoDocumento=0[CR][LF]Modalidade=17[CR][LF]CodTransmissao=10[CR][LF]Convenio=123456[CR][LF]PIX.TipoChavePix=1[CR][LF][email protected][CR][LF][CR][LF][Conta][CR][LF]Conta=99999[CR][LF]DigitoConta=9[CR][LF]Agencia=9999[CR][LF]DigitoAgencia=9[CR][LF]DigitoVerificadorAgenciaConta=[CR][LF][CR][LF][Banco][CR][LF]Numero=237[CR][LF]CNAB=1[CR][LF]TipoCobranca=5[CR][LF]NumeroCorrespondente=0[CR][LF]VersaoArquivo=0[CR][LF]VersaoLote=0[CR][LF][CR][LF][WEBSERVICE][CR][LF]ClientID=[CR][LF]ClientSecret=[CR][LF]KeyUser=[CR][LF]Scope=[CR][LF]IndicadorPix=[CR][LF]Ambiente=[CR][LF]SSLHttpLib=[CR][LF]ArquivoKEY=[CR][LF]ArquivoCRT= )
04/11/24 08:44:11:990 - Travar
04/11/24 08:44:11:991 -    SetRetorno(0, )
04/11/24 08:44:11:991 - FinalizarImpressao - Iniciado
04/11/24 08:44:11:991 - FinalizarImpressao - Feito
04/11/24 08:44:11:991 - Destravar
04/11/24 08:44:11:991 - Boleto_IncluirTitulos([CR][LF][CR][LF][Titulo][CR][LF]NumeroDocumento=000010[CR][LF]NossoNumero=0000001[CR][LF]Carteira=20[CR][LF]ValorDocumento=100,50[CR][LF]Vencimento=10/09/2025[CR][LF]Sacado.NomeSacado=Sacado Teste[CR][LF]Sacado.CNPJCPF=37636044000112[CR][LF]Sacado.Logradouro=Rua Jose Rodrigues[CR][LF]Sacado.Numero=100[CR][LF]Sacado.Bairro=Jardim Moderno[CR][LF]Sacado.Cidade=Tatui[CR][LF]Sacado.UF=SP[CR][LF]Sacado.CEP=18277.500, P )
04/11/24 08:44:11:991 - Travar
04/11/24 08:44:12:598 - FinalizarImpressao - Iniciado
04/11/24 08:44:12:598 - FinalizarImpressao - Feito
04/11/24 08:44:12:598 -    SetRetorno(0, 1 Titulo(s) Carregado(s))
04/11/24 08:44:12:598 - Destravar
04/11/24 08:44:12:600 - Boleto_GerarRemessaStream(1 )
04/11/24 08:44:12:600 - Travar

Alguém consegue me ajudar neste problema?

  • Consultores
Postado

Bom dia !
complementando o que o @Renato Rubinho comentou, na pasta tem permissao de leitura e escrita ?
Se vc utilizar o metodo https://acbr.sourceforge.io/ACBrLib/Boleto_GerarPDF.html
 

ele chega a criar os pdfs na pasta configurada?

Consultor SAC ACBr

Daniel de Morais (Infocotidiano)
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

  • Membros Pro
  • Solution
Postado (editado)

Bom dia, eu dei permissão de leitura e escrita, aumentei o buffer mas continuou o problema, eu consegui resolver alterando na função que chama do FFI:

 Boleto_GerarRemessaStream: ['int', ['pointer', 'int', 'string', 'int']],

para:

 Boleto_GerarRemessaStream: ['int', ['pointer', 'int', 'string', 'string']],

porem agora estou com o mesmo problema na Boleto_RetornaLinhaDigitavel, e já alterei a esTamanho para string mas neste caso não resolveu 😕

EDIT: não estava inicializando corretamente a Boleto_Inicializar na função que chamava a Boleto_RetornaLinhaDigitavel

Editado por GEW Tecnologia
  • Consultores
Postado

o ideal é vc fazer desta forma:
 

#Definir tamanho da resposta
define_bufferResposta(0) # define buffer como 0 para que ele devolva o tamanho correto ao enviar nfe

#Enviar a NFe a SEFAZ
resultado = acbr_lib.NFE_Enviar(ponteiro, 1, False   ,True      ,False   ,sResposta, ctypes.byref(esTamanho)) # esTamanho é o tamanho correto devolvido pelo NFe Enviar
if resultado != 0:
	print("Erro ao executar o metodo enviar, codigo :",resultado)

#Define ultimo retorno baseado no buffer de resposta do NFeEnviar
define_bufferResposta(esTamanho.value) 

#Executa Ultimo Retorno 
LUltimoRetorno = acbr_lib.NFE_UltimoRetorno(ponteiro, sResposta, ctypes.byref(esTamanho)) 
if LUltimoRetorno == 0:
	#exibe resposta completa
	print('Resposta: ',sResposta.value)
else:
	Print('Erro ao executar o metodo Ultimo Retorno, codigo:',LUltimoRetorno)

O Exemplo acime é da NFe, mas é so p vc poder abstrair.
Observe que antes de executar o metodo NFe Enviar, deixo o buffer com 0
Quando executo o NFeEnviar ele devolve o tamanho da resposta correta no esTamanho
Entao, deixo o tamanho do buffer com o valor recebido esTamanho
Executo o metodo NfeUltimoRetorno ele vai devolver no tamanho correto a resposta.
 

  • Curtir 1
Consultor SAC ACBr

Daniel de Morais (Infocotidiano)
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

  • Membros Pro
Postado

Boa tarde, eu tentei mas não tive sucesso em deixar este Buffer "dinâmico", tentei fazer na Boleto_SalvarPDF:

export const salvarPDF = async (
  handle: any
): Promise<ResponseStatusModel> => {
  Logs.info('Boleto.Salvar_PDF');
  return await new Promise((resolve, reject) => {
    let alocResposta = ref.alloc('string');
    let alocTamanho = ref.alloc('int');
  
    const response = AcbrBoleto.Boleto_SalvarPDF(handle, alocResposta, alocTamanho);
  	
    console.log(Buffer.byteLength(alocResposta, 'utf8'));
    console.log(Buffer.byteLength(alocTamanho, 'utf8'));
  
    alocResposta = ref.readPointer(alocResposta, 0, Buffer.byteLength(alocTamanho, 'utf8'));
  
    if (response === -1) {
      return reject({
        status: HttpStatus.BAD_GATEWAY,
        error: 'Falha ao inicializar a biblioteca',
      });
    }

    if (response === -10) {
      return reject({
        status: HttpStatus.BAD_GATEWAY,
        error: 'Falha na execução do método',
      });
    }

    const conteudo = sTrim(alocResposta.toString());

    resolve({
      status: HttpStatus.OK,
      data: conteudo
    });
  });
};

Os console.log retornam 8 e 4 respectivamente, não sei se peguei certo a ideia, mas a resposta é um base64 de 36KB e por ficar com tamanho 4 não retorna nada, se eu setar para 100000 de buffer vem certo o base64

  • Consultores
Postado

Tente assim:

    NFE_CarregarXML: ['int', ['pointer', 'string']],
    NFE_SalvarPDF: ['int',['pointer', 'string','string']],
    libm.NFE_ConfigGravarValor(handle, 'DANFE', 'MostraSetup', '0');
    libm.NFE_ConfigGravarValor(handle, 'DANFE', 'MostraPreview', '0');
    libm.NFE_ConfigGravarValor(handle, 'DANFE', 'MostraStatus', '0');
    
    //Carregando o XMML para a Biblioteca
    let carregaxml = libm.NFE_CarregarXML(handle, pathXML);
    console.log(`carregar xml >>>>>>> ${carregaxml}`);

    //Configurando tamanho buffer de resposta
    aloc_sResposta = Buffer.alloc(2000000); //2MB
    aloc_esTamanho = ref.alloc('int', aloc_sResposta.length);

    //Gera o binario do PDF através do método NFe_SalvarPEF
    let gerpdf = libm.NFE_SalvarPDF(handle, aloc_sResposta, aloc_esTamanho);
    console.log(`gerar pdf >>>>>>> ${gerpdf}`);
    let base64PDF = ref.readCString(aloc_sResposta, 0);
    
    //Finalizando a lib
    let finaliza = libm.NFE_Finalizar(handle);
    console.log(`finalizar >>>>>>>> ${finaliza}`);
 
    //Retornando o PDF base 64
    res.json({
        base64PDF: base64PDF
    });

Acima é exemplo de um usuario NFe, mas é so p vc ver como foi feito e abstrair ai

Consultor SAC ACBr

Daniel de Morais (Infocotidiano)
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...