(formal bug report sent with bug-octave separately)
Several others have reported problems with segmentation faults when
using pkg on Intel Macs. The problem on my machine (Macbook Pro, Mac
OS X 10.4.11) appears to be in the save command when saving in
default (text) form.
Conditions:
latest fink installation; installed octave-2.9.14, then removed so
that I could install octave from CVS (2.9.17+). With that
installation, here's the results. Can anyone else duplicate this
problem?
octave:1> zap.real = 1
zap =
{
real = 1
}
octave:2> zap.imag = 2;
octave:3> zap.chk{1} = rand(3)
zap =
{
real = 1
imag = 2
chk =
{
[1,1] =
0.89862 0.98075 0.19748
0.50522 0.73628 0.55608
0.34868 0.72909 0.69272
}
}
octave:4> save jnk zap
The problem appears to be in the save command when saving in default
(text) mode:
octave:1> zap.real = 1
zap =
{
real = 1
}
octave:2> save -hdf5 jnk zap
octave:3> save jnk zap
I put several print statements in pkg.m (modified file attached) to
track down the segmentation fault. The output is below. The
segmentation fault (octave CVS 2.9.17+) appears to occur in the
"save" command when updating ~/.octave_packages.
I was able to repeat the problem as follows:
octave:1> pkg install -verbose general-1.0.3.tar.gz
pkg: entry
pkg::install: entry
mkdir (/var/tmp/oct-8q8L9Z)
untar (general-1.0.3.tar.gz, /var/tmp/oct-8q8L9Z)
prepare installation 1 of 1
mkoctfile SHA1.cc
mkoctfile deref.cc
mkoctfile mark_for_deletion.cc
pkg::is_architecture_dependent: exit
pkg::is_architecture_dependent: exit
pkg::is_architecture_dependent: exit
pkg::is_architecture_dependent: exit
pkg::is_architecture_dependent: exit
pkg::is_architecture_dependent: exit
pkg::is_architecture_dependent: exit
pkg::is_architecture_dependent: exit
pkg::is_architecture_dependent: exit
pkg::is_architecture_dependent: exit
copyfile /var/tmp/oct-8q8L9Z/general-1.0.3/src/SHA1.oct /var/tmp/
oct-8q8L9Z/general-1.0.3/src/deref.oct /var/tmp/oct-8q8L9Z/ge
ark_for_deletion.oct /var/tmp/oct-8q8L9Z/general-1.0.3/inst/i386-
apple-darwin8.11.1-api-v29
copyfile: entry
copyfile: exit
prepared installation 1 of 1
install 1 of 1
desc 1 of 1
pdir 1 of 1
copyfile: entry
copyfile: exit
copyfile: entry
copyfile: exit
copyfile: entry
copyfile: exit
copyfile: entry
copyfile: exit
copy 1 of 1
create_pkgadddel 1 of 1
and again 1 of 1
installed 1 of 1
check dir 1 of 1
checked dir 1 of 1
autoload check dir 1 of 1
autoload checked dir 1 of 1
add to package list: global_install = 0
add to package list: complement
add to package list: save_order
add to package list: save
*** local user variables:
Prot Name Size Bytes Class
==== ==== ==== ===== =====
rwd local_list 1x31 31 char
Total is 31 elements using 31 bytes
local_list = /Users/hodelas/.octave_packages
*** local user variables:
Prot Name Size Bytes Class
==== ==== ==== ===== =====
rwd local_packages 1x1 229 cell
Total is 1 element using 229 bytes
local_packages =
{
[1,1] =
{
name = general
version = 1.0.3
date = 2007-09-25
author = Various authors
maintainer = The Octave Community
title = General
description = General tools for octave.
categories = General
depends =
{
[1,1] =
{
package = octave
operator = >=
version = 2.9.7
}
}
autoload = 1
license = GPL version 2 or later
url = http://octave.sf.net
dir = /Users/hodelas/octave/general-1.0.3
archprefix = /Users/hodelas/octave/general-1.0.3
}
}
panic: Segmentation fault -- stopping myself...
Segmentation fault
Modified pkg.m diff file:
*** /usr/local/octave/share/octave/2.9.17+/m/pkg/pkg.m Sat Dec 1
18:06:28 2007
--- pkg.m Sat Dec 1 18:04:22 2007
***************
*** 175,180 ****
--- 175,181 ----
## PKG_ADD: mark_as_command pkg
function [local_packages, global_packages] = pkg (varargin)
+ printf("pkg: entry\n"); fflush(stdout);
## Installation prefix (XXX: what should these be on windows?)
persistent user_prefix = false;
persistent prefix = -1;
***************
*** 368,376 ****
--- 369,379 ----
otherwise
error ("you must specify a valid action for 'pkg'. See 'help
pkg' for details");
endswitch
+ printf("pkg: exit\n"); fflush(stdout);
endfunction
function descriptions = rebuild (prefix, archprefix, list, files,
auto, verbose)
+ printf("pkg::rebuild: enter\n"); fflush(stdout);
if (isempty (files))
[dirlist, err, msg] = readdir (prefix);
if (err)
***************
*** 445,453 ****
--- 448,458 ----
descriptions (dup) = [];
endif
endif
+ printf("pkg::rebuild: exit\n"); fflush(stdout);
endfunction
function build (files, handle_deps, autoload, verbose)
+ printf("pkg::build: entry\n"); fflush(stdout);
if (length (files) < 1)
error ("insufficient number of files");
endif
***************
*** 482,491 ****
--- 487,498 ----
unlink (buildlist);
endif
end_unwind_protect
+ printf("pkg::build: exit\n"); fflush(stdout);
endfunction
function install (files, handle_deps, autoload, prefix,
archprefix, verbose,
local_list, global_list, global_install)
+ printf("pkg::install: entry\n"); fflush(stdout);
# Check that the directory in prefix exist. If it doesn't:
create it!
if (! exist (prefix, "dir"))
***************
*** 643,652 ****
--- 650,661 ----
## Prepare each package for installation
try
for i = 1:length (descriptions)
+ printf("prepare installation %d of %d\n",i, length
(descriptions)); fflush(stdout);
desc = descriptions{i};
pdir = packdirs{i};
prepare_installation (desc, pdir);
configure_make (desc, pdir, verbose);
+ printf("prepared installation %d of %d\n",i, length
(descriptions)); fflush(stdout);
endfor
catch
## Something went wrong, delete tmpdirs
***************
*** 678,691 ****
--- 687,710 ----
## Install each package
try
for i = 1:length (descriptions)
+ printf("install %d of %d\n",i, length(descriptions)); fflush
(stdout);
desc = descriptions{i};
+ printf("desc %d of %d\n",i, length(descriptions)); fflush
(stdout);
pdir = packdirs{i};
+ printf("pdir %d of %d\n",i, length(descriptions)); fflush
(stdout);
copy_files (desc, pdir, global_install);
+ printf("copy %d of %d\n",i, length(descriptions)); fflush
(stdout);
create_pkgadddel (desc, pdir, "PKG_ADD", global_install);
+ printf("create_pkgadddel %d of %d\n",i, length
(descriptions)); fflush(stdout);
create_pkgadddel (desc, pdir, "PKG_DEL", global_install);
+ printf("and again %d of %d\n",i, length(descriptions)); fflush
(stdout);
finish_installation (desc, pdir, global_install)
+ printf("installed %d of %d\n",i, length(descriptions)); fflush
(stdout);
endfor
catch
+ printf("uh-oh! something broke!\n");
+ lasterr()
+
## Something went wrong, delete tmpdirs
for i = 1:length (tmpdirs)
rm_rf (tmpdirs{i});
***************
*** 700,705 ****
--- 719,725 ----
## Check if the installed directory is empty. If it is remove it
## from the list
for i = length (descriptions):-1:1
+ printf("check dir %d of %d\n",i, length(descriptions)); fflush
(stdout);
if (dirempty (descriptions{i}.dir, {"packinfo", "doc"}) &&
dirempty (getarchdir (descriptions{i})))
warning ("package %s is empty\n", descriptions{i}.name);
***************
*** 707,738 ****
--- 727,776 ----
rm_rf (getarchdir (descriptions{i}));
descriptions(i) = [];
endif
+ printf("checked dir %d of %d\n",i, length(descriptions)); fflush
(stdout);
endfor
## If the package requested that it is autoloaded, or the
installer
## requested that it is, then mark the package as autoloaded.
for i = length (descriptions):-1:1
+ printf("autoload check dir %d of %d\n",i, length
(descriptions)); fflush(stdout);
if (autoload > 0 || (autoload == 0 && isautoload (descriptions
(i))))
fclose (fopen (fullfile (descriptions{i}.dir, "packinfo",
".autoload"), "wt"));
descriptions{i}.autoload = 1;
endif
+ printf("autoload checked dir %d of %d\n",i, length
(descriptions)); fflush(stdout);
endfor
## Add the packages to the package list
try
+ printf("add to package list: global_install = %d
\n",global_install); fflush(stdout);
if (global_install)
idx = complement (packages_to_uninstall, 1:length
(global_packages));
global_packages = save_order ({global_packages{idx},
descriptions{:}});
save (global_list, "global_packages");
installed_pkgs_lst = {local_packages{:}, global_packages{:}};
else
+ printf("add to package list: complement\n"); fflush(stdout);
idx = complement (packages_to_uninstall, 1:length
(local_packages));
+ printf("add to package list: save_order\n"); fflush(stdout);
local_packages = save_order ({local_packages{idx},
descriptions{:}});
+ printf("add to package list: save\n"); fflush(stdout);
+ whos local_list
+ fflush(stdout);
+ local_list
+ fflush(stdout);
+ whos local_packages
+ fflush(stdout);
+ local_packages
+ fflush(stdout);
save (local_list, "local_packages");
+ printf("add to package list: installed list\n"); fflush(stdout);
installed_pkgs_lst = {local_packages{:}, global_packages{:}};
+ printf("added to package list: \n"); fflush(stdout);
endif
catch
+ printf("on no! %s \n", lasterr()); fflush(stdout);
## Something went wrong, delete tmpdirs
for i = 1:length (tmpdirs)
rm_rf (tmpdirs{i});
***************
*** 746,751 ****
--- 784,790 ----
printf ("error: couldn't append to %s\n", local_list);
endif
rethrow (lasterror ());
+ printf("added to package list: global_install = %d
\n",global_install); fflush(stdout);
end_try_catch
## All is well, let's clean up
***************
*** 774,783 ****
--- 813,824 ----
load_packages_and_dependencies (idx, handle_deps,
installed_pkgs_lst,
global_install);
endif
+ printf("pkg::install: exit\n"); fflush(stdout);
endfunction
function uninstall (pkgnames, handle_deps, verbose, local_list,
global_list, global_install)
+ printf("pkg::uninstall: entry\n"); fflush(stdout);
## Get the list of installed packages
[local_packages, global_packages] = installed_packages(local_list,
global_list);
***************
*** 898,903 ****
--- 939,945 ----
endif
endif
+ printf("pkg::uninstall: exit\n"); fflush(stdout);
endfunction
##########################################################
***************
*** 2053,2058 ****
--- 2095,2101 ----
endfunction
function idx = load_package_dirs (lidx, idx, handle_deps,
installed_pkgs_lst)
+ printf("pkg::load_package_dir: exit\n"); fflush(stdout);
for i = lidx
if (isfield (installed_pkgs_lst{i}, "loaded") &&
installed_pkgs_lst{i}.loaded)
***************
*** 2080,2088 ****
--- 2123,2134 ----
endif
endif
endfor
+ printf("pkg::load_package_dir: exit\n"); fflush(stdout);
+ printf("pkg::install: exit\n"); fflush(stdout);
endfunction
function dep = is_architecture_dependent (nm)
+ printf("pkg::is_architecture_dependent: exit\n"); fflush(stdout);
persistent archdepsuffix =
{".oct",".mex",".a",".so",".so.*",".dll","dylib"};
dep = false;
***************
*** 2103,2106 ****
--- 2149,2153 ----
break;
endif
endfor
+ printf("pkg::is_architecture_dependent: exit\n"); fflush(stdout);
endfunction