Hi, Here is an update of this patch, fixed the local variable issue.
If systemd is not active, the logs are written to dmesg and _/run/initramfs/init.log_.
If "quiet" is set, it also logs to the console.
+**rd.memdebug=[0-3]**::
+ print memory usage debug info, set the verbose level from 1 to 3
+ print nothing when set rd.memdebug=0
+
**rd.break**::
drop to a shell at the end
source_conf /etc/conf.d
+make_trace_mem "hook cmdline" '1+:mem' '1+:iomem' '3+:slab'
# run scriptlets to parse the command line
getarg 'rd.break=cmdline' -d 'rdbreak=cmdline' && emergency_shell -n cmdline "Break before cmdline"
source_hook cmdline
source_conf /etc/conf.d
+make_trace_mem "hook initqueue" '1:shortmem' '2+:mem' '3+:slab'
getarg 'rd.break=initqueue' -d 'rdbreak=initqueue' && emergency_shell -n initqueue "Break before initqueue"
RDRETRY=$(getarg rd.retry -d 'rd_retry=')
source_conf /etc/conf.d
+make_trace_mem "hook pre-pivot" '1:shortmem' '2+:mem' '3+:slab'
# pre pivot scripts are sourced just before we doing cleanup and switch over
# to the new root.
getarg 'rd.break=pre-pivot' 'rdbreak=pre-pivot' && emergency_shell -n pre-pivot "Break pre-pivot"
source_conf /etc/conf.d
+make_trace_mem "hook pre-trigger" "1:shortmem" "2+:mem" "3+:slab"
getargbool 0 rd.udev.info -n -y rdudevinfo && udevadm control --log-priority=info
getargbool 0 rd.udev.debug -n -y rdudevdebug && udevadm control --log-priority=debug
udevproperty "hookdir=$hookdir"
source_conf /etc/conf.d
+make_trace_mem "hook pre-udev" '1:shortmem' '2+:mem' '3+:slab'
# pre pivot scripts are sourced just before we doing cleanup and switch over
# to the new root.
getarg 'rd.break=pre-udev' 'rdbreak=pre-udev' && emergency_shell -n pre-udev "Break pre-udev"
are_lists_eq() {
listlist "$1" "$2" "$3" "$4" && listlist "$1" "$3" "$2" "$4"
}
+
+setmemdebug() {
+ if [ -z "$DEBUG_MEM_LEVEL" ]; then
+ export DEBUG_MEM_LEVEL=$(getargnum 0 0 3 rd.memdebug)
+ fi
+}
+
+setmemdebug
+
+# parameters: msg [trace_level:trace]...
+make_trace_mem()
+{
+ local msg
+ msg="$1"
+ shift
+ if [ -n "$DEBUG_MEM_LEVEL" ] && [ "$DEBUG_MEM_LEVEL" -gt 0 ]; then
+ make_trace show_memstats $DEBUG_MEM_LEVEL "[debug_mem]" "$msg" "$@"
+ fi
+}
+
+# parameters: func log_level prefix msg [trace_level:trace]...
+make_trace()
+{
+ local func log_level prefix msg msg_printed
+ local trace trace_level trace_in_higher_levels insert_trace
+
+ func=$1
+ shift
+
+ log_level=$1
+ shift
+
+ prefix=$1
+ shift
+
+ msg=$1
+ shift
+
+ if [ -z "$log_level" ]; then
+ return
+ fi
+
+ msg=$(echo $msg)
+
+ msg_printed=0
+ while [ $# -gt 0 ]; do
+ trace=${1%%:*}
+ trace_level=${trace%%+}
+ [ "$trace" != "$trace_level" ] && trace_in_higher_levels="yes"
+ trace=${1##*:}
+
+ if [ -z "$trace_level" ]; then
+ trace_level=0
+ fi
+
+ insert_trace=0
+ if [ -n "$trace_in_higher_levels" ]; then
+ if [ "$log_level" -ge "$trace_level" ]; then
+ insert_trace=1
+ fi
+ else
+ if [ "$log_level" -eq "$trace_level" ]; then
+ insert_trace=1
+ fi
+ fi
+
+ if [ $insert_trace -eq 1 ]; then
+ if [ $msg_printed -eq 0 ]; then
+ echo "$prefix $msg"
+ msg_printed=1
+ fi
+ $func $trace
+ fi
+ shift
+ done
+}
+
+# parameters: type
+show_memstats()
+{
+ case $1 in
+ shortmem)
+ cat /proc/meminfo | grep -e "^MemFree" -e "^Cached" -e "^Slab"
+ ;;
+ mem)
+ cat /proc/meminfo
+ ;;
+ slab)
+ cat /proc/slabinfo
+ ;;
+ iomem)
+ cat /proc/iomem
+ ;;
+ esac
+}