Ir para conteúdo
  • Cadastre-se

dev botao

Boleto_GerarRemessaStrem Segmentation fault no Node e Linux


Ver Solução Respondido por Daniel InfoCotidiano,

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
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
  • Solution
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.