{"id":183,"date":"2018-05-13T13:32:28","date_gmt":"2018-05-13T12:32:28","guid":{"rendered":"http:\/\/slackware.wp.w3.pt\/?p=183"},"modified":"2018-05-13T13:42:23","modified_gmt":"2018-05-13T12:42:23","slug":"perl-iosocketinet-segmentation-fault","status":"publish","type":"post","link":"http:\/\/slackware.pt\/?p=183","title":{"rendered":"Perl &#8211; IO::Socket::INET segmentation fault"},"content":{"rendered":"<p>J\u00e1 h\u00e1 uns meses que tinha este problema pendurado e consegui resolv\u00ea-lo hoje.<br \/>\nTenho 18 m\u00e1quinas com o Linux Slackware instalado e todas elas t\u00eam um script, que corre no arranque e no <strong>crontab<\/strong>, e atualiza uma base de dados com as vers\u00f5es dos v\u00e1rios pacotes de software que est\u00e3o instalados, incluindo a vers\u00e3o do kernel. Assim, consigo saber se me escapou alguma m\u00e1quina durante as sess\u00f5es de atualiza\u00e7\u00e3o de software.<\/p>\n<p>Em duas m\u00e1quinas a atualiza\u00e7\u00e3o da BD n\u00e3o era feita porque o script produzia um <strong>segmentation fault<\/strong> ao usar o pacote <strong>IO::Socket::INET<\/strong>.<\/p>\n<p>Hoje andei pela net@ a ver como fazer debug de um programa em Perl e descobri que tinha uma diretoria com ficheiros antigos de Perl, nessas duas m\u00e1quinas, que estavam a causar o problema.<\/p>\n<p>Com o debug, encontrei a origem do erro:<\/p>\n<pre style=\"font-size:0.8em;padding:5px;\">\r\n# perl -d bat\/kern2.pl\r\n\r\nLoading DB routines from perl5db.pl version 1.51\r\nEditor support available.\r\n\r\nEnter h or 'h h' for help, or 'man perldebug' for more help.\r\n\r\nSignal SEGV at \/usr\/local\/lib64\/perl5\/Socket.pm line 858.\r\n        require Socket.pm called at \/usr\/lib64\/perl5\/IO\/Socket.pm line 13\r\n        IO::Socket::BEGIN() called at \/usr\/local\/lib64\/perl5\/Socket.pm line 0\r\n        eval {...} called at \/usr\/local\/lib64\/perl5\/Socket.pm line 0\r\n        require IO\/Socket.pm called at \/usr\/lib64\/perl5\/IO\/Socket\/INET.pm line 11\r\n        IO::Socket::INET::BEGIN() called at \/usr\/local\/lib64\/perl5\/Socket.pm line 0\r\n        eval {...} called at \/usr\/local\/lib64\/perl5\/Socket.pm line 0\r\n        require IO\/Socket\/INET.pm called at bat\/kern2.pl line 3\r\n        main::BEGIN() called at \/usr\/local\/lib64\/perl5\/Socket.pm line 0\r\n        eval {...} called at \/usr\/local\/lib64\/perl5\/Socket.pm line 0\r\nAborted\r\n<\/pre>\n<p>O erro estava na linha <strong>858<\/strong> do ficheiro <strong>\/usr\/local\/lib64\/perl5\/Socket.pm<\/strong>.<\/p>\n<p>Decidi ver se havia diferen\u00e7as, entre m\u00e1quinas, nas diretorias de <strong>INCLUDE<\/strong> e corri o comando seguinte:<\/p>\n<pre>\r\n# perl -E'say for @INC'\r\n\/usr\/local\/lib64\/perl5\r\n\/usr\/local\/share\/perl5\r\n\/usr\/lib64\/perl5\/vendor_perl\r\n\/usr\/share\/perl5\/vendor_perl\r\n\/usr\/lib64\/perl5\r\n\/usr\/share\/perl5\r\n<\/pre>\n<p>Mas as diretorias eram as mesmas tanto nas m\u00e1quinas que corriam o script, como nas que n\u00e3o corriam. <\/p>\n<p>Ent\u00e3o, fui ver se o ficheiro onde o erro ocorria &#8211; <strong>\/usr\/local\/lib64\/perl5\/Socket.pm<\/strong> &#8211; era diferente entre m\u00e1quinas, se, por exemplo, a linha <strong>858<\/strong> era igual entre ficheiros. E descobri que o ficheiro <strong>\/usr\/local\/lib64\/perl5\/Socket.pm<\/strong> s\u00f3 existia nas m\u00e1quinas que n\u00e3o corriam o script. Nas outras m\u00e1quinas, a diretoria <strong>\/usr\/local\/lib64\/perl5\/<\/strong> estava vazia. Apaguei o conte\u00fado dessa diretoria nas m\u00e1quinas-problema, e o problema desapareceu.<\/p>\n<p>H\u00e1 muitos anos atr\u00e1s, tive que instalar o pacote <strong>IO::Socket::INET<\/strong> e outros, nessas m\u00e1quinas, para poder comunicar pela rede, mas agora esses pacotes fazem parte do n\u00facleo do Perl. Os pacotes antigos estavam a sobrepor-se aos do n\u00facleo e estavam a gerar o erro.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J\u00e1 h\u00e1 uns meses que tinha este problema pendurado e consegui resolv\u00ea-lo hoje. Tenho 18 m\u00e1quinas com o Linux Slackware instalado e todas elas t\u00eam um script, que corre no arranque e no crontab, e atualiza uma base de dados com as vers\u00f5es dos v\u00e1rios pacotes de software que est\u00e3o instalados, incluindo a vers\u00e3o do &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/slackware.pt\/?p=183\" class=\"more-link\">Continuar a ler <span class=\"screen-reader-text\">&#8220;Perl &#8211; IO::Socket::INET segmentation fault&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/slackware.pt\/index.php?rest_route=\/wp\/v2\/posts\/183"}],"collection":[{"href":"http:\/\/slackware.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/slackware.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/slackware.pt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/slackware.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=183"}],"version-history":[{"count":8,"href":"http:\/\/slackware.pt\/index.php?rest_route=\/wp\/v2\/posts\/183\/revisions"}],"predecessor-version":[{"id":191,"href":"http:\/\/slackware.pt\/index.php?rest_route=\/wp\/v2\/posts\/183\/revisions\/191"}],"wp:attachment":[{"href":"http:\/\/slackware.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/slackware.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=183"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/slackware.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}